UVA 1197 The Suspects

题意:有0到n-1个学生,0号学生的感染者,现在给出m个小组,每个小组的人相互接触过,如果a和b接触,b和c接触,则a和c也算接触过。问感染者有多少个。
做法:并查集

#include 
#include 
#include 
#include 
using namespace std;
int fa[33333];
void init(int n)
{
    for(int i = 0 ; i < n ; i++)
        fa[i] = i;
}
int getfa(int x)
{
    return fa[x] == x ? x : fa[x] = getfa(fa[x]);
}
int main()
{
    int n,m;
    while(~scanf("%d%d",&n,&m))
    {
        if(m == 0 && n == 0) return 0;
        init(n);
        for(int i = 0 ; i < m ; i++)
        {
            int t,a[33333];
            scanf("%d",&t);
            for(int j = 1 ; j <= t ;j++)
            scanf("%d",&a[j]);
            for(int j = 1 ; j <= t-1 ; j++)
            {
                if(getfa(a[j])!=getfa(a[j+1]));
                fa[getfa(a[j+1])] = getfa(a[j]);
            }
        }
        int ans = 0;
        for(int i = 0 ; i < n ; i++)
        {
            if(getfa(0) == getfa(i))
                ans ++;
        }
        printf("%d\n",ans);
    }
    return 0;
}

你可能感兴趣的:(树状数组-并查集)