题目大意:给你一个图,让你判断有几个连通分量需要几条边?
解题思路:使用并查集,把所有的分量都放在分别的集合中(树状数组中)最后在遍历一边所欲结点,看有几个根节点即可~~
代码:
#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
const int maxn=1000+10;
int p[maxn],n,m;
int Find(int r)
{
int x=r;
while(p[x]!=x)
{
x=p[x];
}
return x;
}
void combine(int a,int b)
{
int tmp1=Find(a);
int tmp2=Find(b);
if(tmp1!=tmp2)
p[tmp2]=tmp1;
}
int main()
{
while(cin>>n,n)
{
for(int i=1;i<=n;i++)//³õʼ»¯
p[i]=i;
cin>>m;
int a,b;
for(int i=0;i<m;i++)
{
cin>>a>>b;
combine(a,b);
}
int cnt=0;
for(int i=1;i<=n;i++)
if(i==p[i]) cnt++;
cout<<cnt-1<<endl;
}
return 0;
}