Better man

改变性格 改变命运!

 

zoj 2833

 1 //并查集
 2 //并查集可以判断图的连通性
 3 //并查集其实还有一个优化:就是路径压缩:即找到u所在树的跟v以后,把从u到v的路径上的所有点的父亲都设置为v,这样可以有效的减少查找的时间
 4 //zoj2833
 5 #include <iostream>
 6 using namespace std;
 7 int n,m;
 8 int father[100000+1];
 9 int f[100000+1];//朋友的个数
10 int rank[100000+1];
11 void make_set(int s)
12 {
13       for(int i=1;i<=s;++i)
14       {
15             f[i]=1;
16             father[i]=i;
17             rank[i]=0;
18       }
19 }
20 int find_set(int x)
21 {
22       if(x!=father[x])
23             father[x]=find_set(father[x]);
24       return father[x];
25 }
26 void union_set(int x,int y)
27 {
28       int a=find_set(x);
29       int b=find_set(y);
30       if(rank[a]>rank[b])
31       {
32             father[b]=a;
33             f[a]+=f[b];
34       }
35       else
36       {
37             father[a]=b;
38             f[b]+=f[a];
39       }
40       if(rank[a]==rank[b])rank[b]++;
41 
42 
43 int main()
44 {      
45       int a,b;
46       char tmp;
47       int cas=0;
48       while(scanf("%d%d",&n,&m)!=EOF)
49       {
50             if(cas)printf("\n");
51             printf("Case %d:\n",++cas);
52             make_set(n);
53             getchar();
54             for(int i=1;i<=m;++i)
55             {
56                   tmp=getchar();
57                   if(tmp=='M')
58                   {
59                         scanf("%d%d",&a,&b);
60                         if(find_set(a)!=find_set(b))
61                               union_set(a,b);
62                   }
63                   if(tmp=='Q')
64                   {
65                         scanf("%d",&a);
66                         int sum=f[find_set(a)];
67                         printf("%d\n",sum);
68                   }
69                   getchar();
70             }
71       }
72       return 0;
73 }
74 

posted on 2009-02-04 13:55 SHFACM 阅读(648) 评论(0)  编辑 收藏 引用


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


导航

统计

常用链接

留言簿(2)

随笔档案

文章分类

文章档案

搜索

最新评论

阅读排行榜

评论排行榜