WA的代码:
#include<cstdio>
#include<set>
#include<algorithm>
using namespace std;
const int MAX=5e4+10;
int fa[MAX],dep[MAX];
int n,m;
void init()
{
for(int i=1;i<=n;i++)
{
fa[i]=i,dep[i]=1;
}
}
int find(int x)
{
if(x==fa[x])
{
return x;
}
else
{
fa[x]=find(fa[x]);
return fa[x];
}
}
void merge(int x,int y)
{
x=find(x),y=find(y);
if(dep[x]<=dep[y])
{
fa[x]=y;
}
else
{
fa[y]=x;
}
if(dep[x]==dep[y]&&x!=y)
{
dep[y]++;
}
}
int main()
{
int now=0;
while(scanf("%d%d",&n,&m)==2&&(n||m))
{
init();
while(m--)
{
int x,y;
scanf("%d%d",&x,&y);
merge(x,y);
}
set<int>ans;
for(int i=1;i<=n;i++)
{
ans.insert(fa[i]);
}
printf("Case %d: %d\n",++now,ans.size());
}
return 0;
}
并查集后找祖宗个数。