#include<iostream>
#include<cmath>
#include<cstring>
#include<algorithm>
using namespace std;
int par[1005];
int ran[1005];
void inital(int n)
{
for(int i=1;i<=n;i++)
{
par[i]=i;
ran[i]=0;
}
}
int find(int x)
{
if(par[x]==x)return x;
else
return par[x]=find(par[x]);//路径压缩,即每一次查找后将查找的值连到根节点
}
void unite(int x,int y)
{
int a=find(x);
int b=find(y);
if(a==b)return ;
if(ran[a]<ran[b])par[a]=b;
else
{
par[b]=a;
if(ran[x]==ran[y])ran[a]++;
}
}//这里用按秩合并
int main()
{
int i,j,k,m,n,a,b;
while(cin>>n&&n!=0)
{ cin>>m;
inital(n);
for(i=1;i<=m;i++)
{
cin>>a>>b;
unite(a,b);
}
int ans=0;
for(j=1;j<=n;j++)
if(par[j]==j)
ans++;
cout<<ans-1<<endl;
}
}
hdoj 畅通工程 并查集
最新推荐文章于 2024-10-08 22:39:57 发布