您的位置:首页 > 其它

POJ - 1611 The Suspects(并查集)

2015-09-16 00:00 375 查看
题目大意:严重急性呼吸系统综合症( SARS), 一种原因不明的非典型性肺炎,从2003年3月中旬开始被认为是全球威胁。为了减少传播给别人的机会, 最好的策略是隔离可能的患者。

在Not-Spreading-Your-Sickness大学( NSYSU), 有许多学生团体。同一组的学生经常彼此相通,一个学生可以同时加入几个小组。为了防止非典的传播,NSYSU收集了所有学生团体的成员名单。他们的标准操作程序(SOP)如下:

一旦一组中有一个可能的患者, 组内的所有成员就都是可能的患者。

然而,他们发现当一个学生被确认为可能的患者后不容易识别所有可能的患者。你的工作是编写一个程序, 发现所有可能的患者。

解题思路:并查集查找和0在同一个集合里面的所有人

[code]#include <cstdio>
#include <cstring>
const int N = 30010;
int n, m;
int f
;

int find(int x) {
    return x == f[x] ? x : f[x] = find(f[x]);
}

void init() {
    for (int i = 0; i <= n; i++)
        f[i] = i;
}

void solve() {

    int num, k, root;
    for (int i = 0; i < m; i++) {
        scanf("%d%d", &num, &k);
        root = find(k);
        for (int j =  1; j < num; j++) {
            scanf("%d", &k);
            int tx = find(k);
            if (tx != root)
                f[tx] = root;
        }
    }

    int SARS = find(0);
    int ans = 1;
    for (int i = 1; i <= n; i++)
        if (find(i) == SARS)
            ans++;
    printf("%d\n", ans);

}

int main() {
    while (scanf("%d%d", &n, &m) != EOF && n + m) {
        init();
        solve();
    }
    return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: