POJ 2524 - Ubiquitous Religions

Advanced Data Structures :: Disjoint Set


Description

有n个学生,编号从1~n。

学生们大都信仰着各自的神,各自的宗教。

当然也有不少同学有着相同的信仰。

那么,告诉你哪些同学有相同的信仰,

请求出有多少个神在同学们的心中。


Type

Advanced Data Structures :: Disjoint Set


Analysis

假设一个开头就有n个宗教,

然后用并查集并一下,

在并的时候检查是否原来就在同一个宗教,

否则每次合并都会少一个宗教。

并完之后,剩下的宗教数就是最后要求的宗教数了。


Solution

// POJ 2524
// Ubiquitous Religions
// by A Cod e Rabbit

#include <cstdio>

const int MAXN = 50002;

struct DisjointSet {
    int p[MAXN];
    int ans;
    void Init(int);
    void Make(int x) { p[x] = x; }
    int Find(int x) { return p[x] == x ? x : p[x] = Find(p[x]); }
    int Union(int x, int y) {
        if (Find(x) != Find(y)) ans--;
        p[Find(x)] = Find(y);
    }
};

void DisjointSet::Init(int n) {
    for (int i = 1; i <= n; i++)
        Make(i);
    ans = n;
}

int n, m;
DisjointSet set;

int main() {
    int cnt_case = 0;
    while (scanf("%d%d", &n, &m) && (n || m)) {
        set.Init(n);
        for (int i = 0; i < m; i++) {
            int x, y;
            scanf("%d%d", &x, &y);
            set.Union(x, y);
        }
        printf("Case %d: %d\n", ++cnt_case, set.ans);
    }

    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值