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 }