题意:总共有n个学生编号1到n,给出m对有着相同宗教信仰的学生编号,输出共有多少宗教
直接用并查集即可,并查集水题
#include<stdio.h>
int pre[50001];
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)
{
int tx=find(x),ty=find(y);
if(tx!=ty)
{
pre[ty]=tx;
}
}
int main(void)
{
int n,m;
int count=0;
while(scanf("%d%d",&n,&m)!=EOF)
{
if(n==m&&n==0) break;
int sum=0;
int a,b;
for(int i=1;i<=n;i++)
pre[i]=i;
for(int i=1;i<=m;i++)
{
scanf("%d%d",&a,&b);
join(a,b);
}
for(int i=1;i<=n;i++)
{
if(pre[i]==i) sum++;
}
printf("Case %d: %d\n",++count,sum);
}
return 0;
}