依然是并查集的思路,我们只需要求出有几个集合就行了,最后用集合数减去1,比如3个点只需要两条线段链接~
下面是是AC代码~
#include <iostream>
#include <cstring>
#define Max 1005
int a[Max];
bool flag[Max];
using namespace std;
int find(int x1); //寻找父节点
void unions(int x1,int x2);
int main()
{
int n,m,cnt;
while(cin>>n>>m&&n!=0)
{
int x1,x2;
cnt=0;
memset(flag,false, sizeof(flag));
for(int i=1;i<=n;i++)
{
a[i]=i;
}
for(int i=1;i<=m;i++)
{
cin>>x1>>x2;
unions(x1,x2);
}
for(int i=1;i<=n;i++)
{
flag[find(i)]=true;
}
for(int i=1;i<=n;i++)
{
cnt+=flag[i];
}
cout<<cnt-1<<endl;
}
}
int find(int x1) //寻找父节点
{
return x1==a[x1] ? x1:find(a[x1]);
}
void unions(int x1,int x2)
{
int y1=find(x1);
int y2=find(x2);
a[y1]=y2;
}