您的位置:首页 > 其它

poj 1611

2011-07-20 18:25 134 查看
http://poj.org/problem?id=1611
并查集的基本应用题
View Code

#include <stdio.h>
#include <stdlib.h>
int father[30005],num[30005];

void make_set(int x)
{
father[x] = x;
num[x] = 1;
}

//查找x元素所在的集合,回溯时压缩路径
int find_set(int x)
{
if(x != father[x])
{
father[x] = find_set(father[x]);//这个回溯时的压缩路径是精华
}
return father[x];
}

void union_set(int a,int b)
{
a = find_set(a);
b = find_set(b);
if(a == b) return ;
if(num[a] <= num[b])
{
father[a] = b;
num[b] += num[a];
}
else
{
father[b] = a;
num[a] += num[b];
}
}
int main()
{
int n,m,a,b,t,i,j;
while(scanf("%d %d",&n,&m) == 2)
{
if(n + m == 0) break;
for(i = 0;i < n;i ++)
{
make_set(i);
}
for(i = 0;i < m;i ++)
{
scanf("%d",&t);
scanf("%d",&a);
for(j = 1;j < t;j ++)
{
scanf("%d",&b);
union_set(a,b);
}
}
printf("%d\n",num[find_set(0)]);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: