并查集水题。。。函数都不用改
#include <iostream>
#include <cstring>
using namespace std;
int father[1001];
int rank[1001];
int sum;
int find(int x)
{
while (x!=father[x])
x=father[x];
return x;
}
void Union(int a,int b)
{
a=find(a);
b=find(b);
if (a==b)
return ;
sum--;
if (rank[a]>rank[b])
father[b]=a;
else
{
if (rank[a]<rank[b])
father[a]=b;
else
{
father[a]=b;
rank[b]++;
}
}
}
void inint()
{
memset(rank,0,sizeof(rank));
for (int i=0;i<=1000;i++)
father[i]=i;
}
int main()
{
int r;
int n,m;
while (cin>>n&&n)
{
inint();
cin>>m;
sum=n;
for (int i=1;i<=m;i++)
{
int a,b;
cin>>a>>b;
Union(a,b);
}
cout<<sum-1<<endl;
}
}