并查集-poj-1611-The Suspectst

来源:互联网 发布:淘宝跳转链接代码 编辑:程序博客网 时间:2024/06/08 10:13

题目的意思是有0到n个人,0号感染病毒,数据有m组每组的人只要有一个就所有人都会被感染。问一共有几个人被感染。

简单的并查集,fa表示种类,num表示该种类的个数,不包括父节点,找的时候只要找到根就好。

#include<cstdio>#include<iostream>#include<cmath>#include<cstring>#include<algorithm>using namespace std;int fa[33333];int num[33333];int find_fa(int n) {    return fa[n]==n?n:find_fa(fa[n]);}void inti(int n) {    for(int i=0;i<=n;i++) {        fa[i]=i;        num[i]=1;    }}int main(){    int n,m;    while(scanf("%d%d",&n,&m)&&(m+n)!=0) {        inti(n);        int x,a;        for(int i=1;i<=m;i++) {            scanf("%d",&x);            scanf("%d",&a);            int fx=find_fa(a);            int tt;            for(int j=2;j<=x;j++) {                scanf("%d",&tt);                int fy=find_fa(tt);                if(fx!=fy) {                    fa[fy]=fx;                    num[fx]+=num[fy];                }            }        }        int sss=find_fa(fa[0]);        cout << num[sss] << endl;    }    return 0;}


0 0