题目链接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=71310#problem/E
这道题也是非常经典的并查集,类似于n个点,(n-1)条边的问题,以下是代码
#include <iostream>
using namespace std;
int pre[20010];
void init (int n)
{
int i;
for(i=0;i<=n;i++)
pre[i]=i;
}
int find(int x)
{
int root=x;
while(pre[root]!=root)
root=pre[root];
int cur=x,tmp;
while(cur!=root)
{
tmp=pre[cur];
pre[cur]=root;
cur=tmp;
}
return root;
}
int main()
{
int n,m,a,b;
while(cin>>n&&n)
{
cin>>m;
init(n);
while(m--)
{
cin>>a>>b;
int f1=find(a);
int f2=find(b);
if(f1!=f2){
pre[f1]=f2;
n--;
}
}
cout <<n-1<< endl;
}
return 0;
}