ZSC 1155 ZQU_ACM 协会 (并查集入门)

Description
ACMer在ZQU已经有好几年的历史了,最近,他们想成立一个协会,叫ZQU_ICPC协会。我们都知道,在ZQU成立一个协会是需要很多手续的,而且还有一个人数上的条件,即必须满足一定的人数才可以得到学校的批准。 所以,现有的ACMer开始到处宣传,希望能够找到尽量多的人进入协会。 现在给出同学们的关系以及最开始的ACMer的号码。 请问他们的人数足够满足条件吗?

Input
输入有多个测试用例。 每个测试用例的第一行是三个数字n,m和num,n表示一共有多少个人,m表示有多少同学之间是有关系的,num表示成立协会的最少人数。( 1 < n <100 ,m<200 , num <= n ) 接下来有m行,每行两个数字 a b,表示a和b有关系,只要其中一个加入ZQU_ICPC协会,那么另外一个也会加入到ACMer的行列。 接下来一行是一个数字k,表示最开始有k个ACMer,接下来一行有k个数字(0 <= ki < n)表示最初的ACMer们的编号。

Output
对于每个测试用例,如果满足人数上的条件,输出”YES”,否则输出”SORRY”

Sample Input
10 5 5
1 2
0 2
6 7
4 2
3 1
1
4

#include <iostream>
#include <cstring>
using namespace std;
int n, m, num, k, head, stu[1000];
int superior[1000]; //记录父结点

int find(int one) {
    int per = one;
    while (superior[per] != per) { //逐级寻找,直到其本身就是父结点
        per = superior[per];
    }
    int i = one, temp;
    while (superior[i] != per) { //路径压缩
        temp = superior[i];
        superior[i] = per;
        i = temp;
    }
    return per;
}

void merge(int a, int b) { //合并集
    int fa = find(a);
    int fb = find(b);
    if (fa != fb) {
        superior[fb] = fa;
    }
}

int main() {
    int per, per2, cnt;
    while (scanf("%d%d%d", &n, &m, &num) != EOF) {
        memset(superior, 0, sizeof(superior));
        for (int i = 0; i < 2*m; ++i) { //吸收数据
            scanf("%d", &stu[i]);
            superior[stu[i]] = stu[i];
        }
        for (int i = 1; i < 2*m; i += 2) //整理数据
            merge(stu[i - 1], stu[i]);
        scanf("%d", &k);
        scanf("%d", &head);
        superior[head] = head; //指定最终结点
        for (int i = 1; i < k; ++i) {
            scanf("%d", &per);
            merge(head, per);
        }
        cnt = 0;
        for (int i = 0; i <= n; ++i) {
            if (find(i) == head) ++cnt;
        }
        printf("%s\n", cnt >= num ? "YES" : "SORRY");
    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值