poj 2524 - Ubiquitous Religions(并查集)

题意:

统计1-n的宗教信仰的种类,这里假设:没有关系的两个人的信仰肯定是不同的。

思路:

并查集来合并所有有相同信仰的人,最后统计集合的个数即可。

代码如下:

const int M = 50005;
int p[M], flag[M];
int find(int x) { return p[x]==x?x:p[x]=find(p[x]); }
int main()
{
    int n, m, a, b, k = 0;
    while(scanf("%d%d", &n, &m) && n+m)
    {
        for(int i = 1; i <= n; ++i) p[i] = i, flag[i] = 1;
        for(int i = 1; i <= m; ++i)
        {
            scanf("%d%d", &a, &b);
            int x = find(a);
            int y = find(b);
            if(x!=y)
                p[x] = y;
        }
        int ans = 0, tmp;
        for(int i = 1; i <= n; ++i)
        {
            tmp = find(i);
            ans+=flag[tmp];
            flag[tmp] = 0;
        }
        printf("Case %d: %d\n", ++k, ans);
    }
    return 0;
}


你可能感兴趣的:(poj 2524 - Ubiquitous Religions(并查集))