正题
题目链接:
http://poj.org/problem?id=1611
大意
有n个人,m个组,有一个流感嫌犯,流感嫌犯会将所在的组的所有人变成流感嫌犯,求流感嫌犯的数量。
解题思路
并查集将各个组合并,然后看看那些人是和嫌犯一个组的就好了。
代码
#include<cstdio>
#include<algorithm>
using namespace std;
int lt[30001],x,k,n,m,s,head;
int father(int x)
{if (lt[x]!=x) lt[x]=father(lt[x]);return lt[x];
}//寻找祖先
void unionn(int x,int y)
{int fa=father(x);int fb=father(y);if (fa<fb) lt[fb]=fa;else lt[fa]=fb;//取最小的当祖先
}//链接两点
int main()
{while (true){scanf("%d%d",&n,&m);if (n==0) break;for (int i=0;i<n;i++) lt[i]=i;for (int i=1;i<=m;i++){scanf("%d",&k);if (k>=1) scanf("%d",&head);for (int j=2;j<=k;j++){scanf("%d",&x);unionn(x,head);//连接}}s=0;for (int i=0;i<n;i++) if (father(i)==0) s++;//统计数量printf("%d\n",s);}
}