题目链接:http://poj.org/problem?id=1611
//非常基础的并查集 <wbr>可以参考<a href="http://www.cnblogs.com/cherish_yimi/archive/2009/10/11/1580839.html"><span style="color:#744d22">http://www.cnblogs.com/cherish_yimi/archive/2009/10/11/1580839.</span></a><a href="http://www.cnblogs.com/cherish_yimi/archive/2009/10/11/1580839.html"><span style="color:#744d22">html</span></a></wbr>
#include<iostream>
using namespace std;
int f[30000],rank[30000];
void makeset(int x)
{
int i;
for(i=0;i<x;i++)
f[i]=i,rank[i]=0;
}
int findset(int x)
{
if(x!=f[x])
f[x]=findset(f[x]);
return f[x];
}
void unionset(int a,int b)
{
int fa=findset(a);
int fb=findset(b);
if(rank[fa]>rank[fb])f[fb]=fa;
else
{
if(rank[fa]==rank[fb])rank[fb]++;
f[fa]=fb;
}
}
int main()
{
int n,m;
while(cin>>n>>m,n||m)
{
int cnt=1;//′ú±í?Dè?êy
int i,j;
makeset(n);
for(i=0;i<m;i++)
{
int t,a,b;
cin>>t;
cin>>a;
for(j=1;j<t;j++)
{
cin>>b;
unionset(a,b);
a=b;
}
}
int st=findset(0);
for(i=1;i<n;i++)
if(st==findset(i))
cnt++;
cout<<cnt<<endl;
}
return 0;
}
本文详细介绍了如何使用并查集解决图论中连接性问题的基础算法实现。通过POJ 1611题目的实例讲解,展示了并查集的基本操作如初始化、查找集合代表元及合并集合的方法。
2206

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



