题意:简单并查集
解析:统计不同信仰的学生,标记即可
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=50009;
int student[maxn];
int n,m;
int find(int x)
{
if(student[x]!=x)
return student[x]=find(student[x]);
}
void merge(int x,int y)
{
int a=find(x);
int b=find(y);
if(a!=b)
student[a]=b;
}
int main()
{
int cases=1;
while(scanf("%d%d",&n,&m)!=EOF&&n&&m)
{
for(int i=0;i<=n;i++)
student[i]=i;
int x,y;
for(int i=0;i<m;i++)
{
scanf("%d%d",&x,&y);
merge(x,y);
}
int cnt[maxn];
memset(cnt,0,sizeof(cnt));
int ans=0;
for(int i=1;i<=n;i++)
cnt[find(i)]++;
for(int i=1;i<=n;i++)
if(cnt[i]>0)
ans++;
printf("Case %d: %d\n",cases++,ans);
}
}