您的位置:首页 > 其它

poj1611 The Suspects (并查集)

2012-07-26 01:01 363 查看
题目链接:http://poj.org/problem?id=1611

//非常基础的并查集 可以参考http://www.cnblogs.com/cherish_yimi/archive/2009/10/11/1580839.html

#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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: