您的位置:首页 > 其它

POJ The Suspects(基本的并查集)

2012-12-16 10:45 344 查看
没什么好说的,并查集的基本操作,都在注释里了

#include <iostream>
#include <cstdio>
#include <cstring>
#define MAXN 30005
using namespace std;
int parent[MAXN];
int rank[MAXN];//并查集的秩,根据题意,这里选用树的结点数。
void MakeSet(int n)
{
for(int i=0; i<=n; i++)
{
parent[i]=i;
rank[i]=1;
}
}
int FindParent(int x)
{
if(x!=parent[x])
parent[x]=FindParent(parent[x]);
return parent[x];
}
void UnionSet(int x,int y)
{
int px,py;
px=FindParent(x);
py=FindParent(y);
if(px==py)return;
if(rank[px]>=rank[py])
{
parent[py]=px;
rank[px]+=rank[py];
//   rank[py]=0; 这里不能搞成0.因为rank[i]表示的是以i为根的树的结点数。
}
else
{
parent[px]=py;
rank[py]+=rank[px];
//  rank[px]=0;
}
}
int main()
{
int n,m;
while(scanf("%d %d",&n,&m)!=EOF&&(n||m))
{
MakeSet(n);
if(n==0)continue; //poj里有n=0的坑爹数据,特判下
for(int i=0; i<m; i++)
{
int t;
int id;
int leader;
scanf("%d %d",&t,&leader);
t--;
while(t--)
{
scanf("%d",&id);
UnionSet(leader,id); //每一个group的leader取这个group的第一个人
}
}
printf("%d\n",rank[FindParent(0)]);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: