题目链接:点击打开链接
#include<iostream>
#include<vector>
#include<map>
#include<algorithm>
#include<cstdio>
#include<cstring>
using namespace std;
const int maxn=1e3+10;
int pre[maxn],t[maxn];
int Find(int x)
{
int r=x;
while(r!=pre[r])
r=pre[r];
int i=x,j;
while(pre[i]!=r)
{
j=pre[i];// 在改变上级之前用临时变量 j 记录下他的值
pre[i]=r;//把上级改为根节点
i=j;
}
return r;
}
void join(int x,int y)
{
int fx=Find(x),fy=Find(y);
if(fx!=fy)
{
pre[fy]=fx;
}
}
int main()
{
int n,m,i,a,b;
while(~scanf("%d",&n)&&n)
{
scanf("%d",&m);
memset(t,0,sizeof(t));
for(i=1;i<=n;i++)pre[i]=i;
while(m--)
{
scanf("%d %d",&a,&b);
join(a,b);
}
for(i=1;i<=n;i++)
t[Find(i)]=1;
int cunt=0;
for(i=1;i<=n;i++)
if(t[i])cunt++;
printf("%d\n",cunt-1);
}
}