# include<stdio.h>
#include<iostream>
using namespace std;
int set[1024];//存储根节点
int find(int x)//查找根节点
{
if(set[x]!=x)
set[x]=find(set[x]);
return set[x];
}
void jion(int x,int y)//合并
{
int a,b;
a=find(x);
b=find(y);
if(a!=b)
set[a]=b;
}
int main()
{
int m,n,i,a,b,count;
while(cin >>n >> m&&n)
{
for(i=1;i<=n;i++)
set[i]=i;
while(m--)
{
cin >>a >>b;
jion(a,b);
}
count=-1;//两个根节点连接只要要一条路,所以要从1开始
for(i=1;i<=n;i++)
if(set[i]==i)
count++;
cout << count << endl;
}
return 0;
}
才学是开可课件的思路,和部分代码写出来的!
给点像我这样的初学者一点建议吧,最好自己画图,把这个入门程序理解啦,ac啦就明白并查集怎么回事儿啦!