题目大意:
问一个大学里学生的宗教,通过问一个学生可以知道另一个学生是不是跟他信仰同样的宗教。问学校里最多可能多少个宗教。也就是给定一个图的点数和相应的边,问有多少个连通分量。
解题思路:
用并查集,首先,使每个节点的根节点都指向自己,将根节点不相同的节点合并。要注意题目要求的输出格式。
c代码:
#include<stdio.h>
#include<string.h>
#define max 50010
int pre[max];
int s;
int find(int i)
{
if(pre[i]==i)
return i;
return find(pre[i]);
}
void sum(int i,int j)
{
int c=find(i),d=find(j);
if(c!=d)
{pre[c]=d;s--;}
}
int main()
{
int n,m,x,y,z=0;
while(scanf("%d %d",&n,&m)!=EOF)
{
if(n==0&&m==0)
break;
memset(pre,0,sizeof(pre));
s=n;
for(int i=1;i<=n;i++)
pre[i]=i;
while(m--)
{
scanf("%d %d",&x,&y);
sum(x,y);
}
printf("Case %d: ",++z);
printf("%d\n",s);
}
getchar();
return 0;
}