A Za, A Za, Fighting...

坚信:勤能补拙

PKU 1988 Cube Stacking

问题:
http://acm.pku.edu.cn/JudgeOnline/problem?id=1988

思路:
并查集的妙用
up[i]记录节点i到根节点的距离(有多少元素)
sum[i]记录以i作为根节点的树所包含的节点的个数
重点是在进行union与find操作时如何更新这两个数组,find操作所暗含路径压缩时up数组的更新较难理解

参考:
http://www.cppblog.com/longzxr/archive/2009/07/13/89974.html

代码:
 1 #include<stdio.h>
 2 #include<stdlib.h>
 3 #include<string.h>
 4 #define MAX_NUM 30005
 5 int father[MAX_NUM], up[MAX_NUM], sum[MAX_NUM];
 6 
 7 void
 8 init()
 9 {
10     int i;
11     for(i=1; i<MAX_NUM; i++) {
12         father[i] = i;
13         sum[i] = 1;
14         up[i] = 0;
15     }
16 }
17 
18 int
19 find(int item)
20 {
21     int tmp = father[item];
22     if(father[item] != item) {
23         father[item] = find(father[item]);
24         up[item] += up[tmp];
25     }
26     return father[item];
27 }
28 
29 void
30 uunion(int top, int down)
31 {
32     int a = find(top);
33     int b = find(down);
34     if(a == b)
35         return;
36     father[b] = a;
37     up[b] = sum[a];
38     sum[a] += sum[b];
39 }
40 
41 int
42 main(int argc, char **argv)
43 {
44     int p, top, down, r, cube;
45     char ch[2];
46     scanf("%d"&p);
47     init();
48     while(p--) {
49         scanf("%s", ch);
50         if(ch[0== 'M') {
51             scanf("%d %d"&top, &down);
52             uunion(top, down);
53         } else {
54             scanf("%d"&cube);
55             r = find(cube);
56             printf("%d\n", sum[r]-up[cube]-1);
57         }
58     }
59 }

posted on 2010-08-09 14:59 simplyzhao 阅读(200) 评论(0)  编辑 收藏 引用 所属分类: E_数据结构


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理


导航

<2024年4月>
31123456
78910111213
14151617181920
21222324252627
2829301234
567891011

统计

常用链接

留言簿(1)

随笔分类

随笔档案

搜索

最新评论

阅读排行榜

评论排行榜