标签:
Description
Input
Output
Sample Input
100 4 2 1 2 5 10 13 11 12 14 2 0 1 2 99 2 200 2 1 5 5 1 2 3 4 5 1 0 0 0
Sample Output
4 1 1
AC代码:
#include <iostream>
#include<cstdio>
using namespace std;
int father[30001],sum[30001];
int f(int n)
{
if(n!=father[n])
father[n]=f(father[n]);
return father[n];
//或return father[n]==n?n:father[n]=f(father[n]);
}//获取根节点
void merge(int x,int y)
{
int fx,fy;
fx=f(x);
fy=f(y);
if(fx<fy)
{
father[fy]=fx;
sum[fx]+=sum[fy];
}
if(fx>fy)
{
father[fx]=fy;
sum[fy]+=sum[fx];
}
} //合并两个元素所在的集合
//判断两个元素是否属于同一个集合
int main()
{
int n,m,k,p,q;
while(~scanf("%d%d",&n,&m))
{
for(int i=0;i<=n;i++)
{
father[i]=i;
sum[i]=1;
}//初始化
if(n==0&&m==0)break;
for(int i=0;i<m;i++)
{
scanf("%d%d",&k,&p);
for(int j=1;j<k;j++)
{
scanf("%d",&q);
merge(p,q);
}
}
printf("%d\n",sum[0]);//与0有染的人的个数
}
return 0;
}
分析:本题可以用并查集解决,就是让你求有多少人与0号有关
心得:之前没见过这种题目,读了很久也没读懂问题的实质,然后自己去网上搜了一下,又看了一下并查集的概念和算法,最后还是将这个题做了出来,但是感觉对并查集还是不是很懂。这也是一个模板题。
标签:
原文地址:http://www.cnblogs.com/lbyj/p/5696280.html