http://poj.org/problem?id=2524
#include<iostream>
#include<stdio.h>
using namespace std;
int a[50050];
int f[50050];
int find(int x){
if(x!=a[x]) a[x]=find(a[x]);
return a[x];
}
int main()
{
int n,m,x,y,num=1;
while(cin>>n>>m){
if(n==0 && m==0) break;
for(int i=1;i<=n;i++){
a[i]=i;
f[i]=0;
}
int re=n;
for(int i=1;i<=m;i++){
cin>>x>>y;
x=find(x);
y=find(y);
if(x==y) continue;
re--;
if(f[x]>f[y]) a[y]=x;
else a[x]=y;
if(f[x]==f[y]) f[y]++;
}
cout<<"Case "<<num<<": "<<re<<endl;
num++;
}
return 0;
}
本文通过一个具体的程序实例,深入浅出地介绍了并查集算法的实现原理及其应用。通过对输入数据进行处理,实现了节点之间的查找与合并操作,有效地解决了图论中连接分量的问题。
1141

被折叠的 条评论
为什么被折叠?



