裸并查集
直接改的模板
#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
int n,m,f,t,s[50005],rank[50005];
int find(int x)
{
if(s[x]!=x)
return s[x]=find(s[x]);
return x;
}
void un(int a,int b)
{
int x=find(a);
int y=find(b);
if(x!=y)
{
s[y]=x;//或者直接在这里统计连通图个数
}
}
int main()
{
int casen=0;
while(scanf("%d%d",&n,&m)&&(n||m))
{
for(int i=0; i<n; i++)
{
s[i]=i;
}
for(int i=0; i<m; i++)
{
scanf("%d%d",&f,&t);
un(f,t);
}
memset(rank,0,sizeof(rank));
for(int i=0; i<n; i++)
{
rank[find(s[i])]=1;//find到所有的根节点,标记为1,用于统计连通图的个数
}
int sum=0;
for(int i=0; i<n; i++)
if(rank[i]==1)
sum++;
printf("Case %d: %d\n",++casen,sum);
}
return 0;
}