只要最后统计出有多少个集合就好了
我用并查集还有set做的,好像用set慢了一点
#include<stdio.h>
#include<set>
using namespace std;
int f[1010];
int find(int x)
{
if(x==f[x])
return f[x];
f[x]=find(f[x]);
return f[x];
}
void Union(int x,int y)
{
int a=find(x);
int b=find(y);
if(a==b)
return ;
f[a]=b;
return ;
}
int main()
{
int n,m,i;
int a,b;
while(scanf("%d",&n)&&n)
{
scanf("%d",&m);
for(i=1;i<=n;i++)
f[i]=i;
for(i=1;i<=m;i++)
{
scanf("%d %d",&a,&b);
Union(a,b);
}
set<int> s;
for(i=1;i<=n;i++)
{
s.insert(find(i));
}
printf("%d\n",s.size()-1);
}
return 0;
}