poj 2524 (并查集)

http://poj.org/problem?id=2524

题意:在一所学校里面的人,都有宗教信仰,不过他们的宗教信仰有可能相同有可能不同,但你又不能直接去问他们,但你可以问他们和谁是同一个宗教。通过n次询问,求这个学校最多有多少种宗教信仰。

思路:一个并查集的水题。首先假设这个学校的人全都是不同的信仰。然后再去询问,如果两个人的信仰是相同的,合并这两个人且ans--。最后减出来的ans就是答案。

 1 #include <stdio.h>
 2 #include <iostream>
 3 #include <string.h>
 4 #define l 50005
 5 
 6 int ans,belg[l];
 7 
 8 int Find(int x)
 9 {
10     int _x=x,_b;
11     while(_x!=belg[_x])
12     {
13         _x=belg[_x];
14     }
15     while(x!=belg[x])
16     {
17         _b=belg[x];
18         belg[x]=_x;
19         x=_b;
20     }
21     return _x;
22 }
23 
24 int unio(int x,int y)
25 {
26     int root1=Find(x);
27     int root2=Find(y);
28     if(root1!=root2) {belg[root1]=root2;return 1;}   //这里是用来判断这两个人的信仰是否相同,如果之前不同的话,那么合并且ans--。
29     return 0;
30 }
31 
32 int main()
33 {
34 //    freopen("in.txt","r",stdin);
35     int m,n,a,b,cas=0;
36     while(scanf("%d%d",&m,&n),m||n)
37     {
38         for(int i=1;i<=m;i++)
39             belg[i]=i;
40         ans=m;
41         for(int i=0;i<n;i++)
42         {
43             scanf("%d%d",&a,&b);
44             if(unio(a,b)) ans--;
45         }
46         printf("Case %d: %d\n",++cas,ans);
47     }
48     return 0;
49 }

 

posted @ 2016-07-28 09:15  一个_小菜鸟  阅读(210)  评论(0编辑  收藏  举报