題目鏈接:http://poj.org/problem?id=2524
這道題屬於並查集
題目大意:
在一個學校內調查學生的信仰情況,告訴你學校有n個人,給你共m組x,y表示信教情況相同,問一個學校學生信仰的宗教的最大種數
這也是一道模板題,沒啥說的,我在另一篇文章裏面講過模板題的做法,大家可以參考下。http://blog.csdn.net/xdz78/article/details/47296585
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int pre[50010];
int find(int x){
int r=x;
while(pre[r]!=r){
r=pre[r];
}
//路徑壓縮,優化
int i=x,j;
while(i!=r){
j=pre[i];
pre[i]=r;
i=j;
}
return r;//返回根節點
}
void join(int x,int y){//如果x,y在不同樹上就把x,y的根節點改成一樣的。在一棵樹上就不要動了
int r_x=find(x),r_y=find(y);
if(r_x!=r_y){
pre[r_x]=r_y;
}
}
int main()
{
int hash[50010];
int sum,x,y,i,j=1;
int n,m;
while(scanf("%d%d",&n,&m)&&n!=0&&m!=0){
sum=0;
memset(hash,0,sizeof(hash));
for(i=1;i<=n;i++){
pre[i]=i;
}
//前面是初始化
while(m--){
scanf("%d%d",&x,&y);
join(x,y);
}//把所有關係加入到樹中
for(i=1;i<=n;i++){
hash[find(i)]=1;//簡單哈希
}
for(i=1;i<=n;i++){
sum+=hash[i];
}
printf("Case %d: %d\n",j++,sum);
}
return 0;
}