ACM蓝桥杯入门 并查集题目 A Bug‘s Life

解答:

#include <stdio.h>
int fa[2005];
int opp[2005];  
int find(int x) {
    if (fa[x] != x) {
        fa[x] = find(fa[x]);
    }
    return fa[x];
}
void init(int x) {
    for (int i = 1; i <= x; i++) {
        fa[i] = i;
        opp[i] = 0;
    }
}
void merge(int x, int y) {
    int x1 = find(x);
    int y1 = find(y);
    if (x1 != y1) {
        fa[y1] = x1;
    }
}
int main() {
    int n, m, t, x, y;
    scanf("%d", &n);
    for (int i = 1; i <= n; i++) {
        scanf("%d %d", &m, &t);
        init(m);
        int suspicious = 0;  
        for (int j = 1; j <= t; j++) {
            scanf("%d %d", &x, &y);
            if (suspicious!=0) {
                continue; 
            } 
            if (find(x) == find(y)) {
                suspicious = 1;  
            } else {
                if (opp[x] == 0) {
                    opp[x] = y;
                }
                if (opp[y] == 0) {
                    opp[y] = x;
                }
                merge(x, opp[y]);  
                merge(y, opp[x]);  
            }
        }
        printf("Scenario #%d:\n", i);
        if (suspicious) {
            printf("Suspicious bugs found!\n");
        } else {
            printf("No suspicious bugs found!\n");
        }
        printf("\n");
    }
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值