专栏文章

题解:AT_abc399_c [ABC399C] Make it Forest

AT_abc399_c题解参与者 1已保存评论 0

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
0 条
当前快照
1 份
快照标识符
@miprtkjb
此快照首次捕获于
2025/12/03 16:54
3 个月前
此快照最后确认于
2025/12/03 16:54
3 个月前
查看原文
显然,用并查集在输入时维护当前两个点是否连通即可,联通则答案加一,因为要把他们拆开,不联通不管。

Code

CPP
#include <bits/stdc++.h>
using namespace std;
int n, m, u, v, res;
struct UF {
    vector<int> pa, rk;
    UF(int n) : pa(n+1), rk(n+1, 0) {
        iota(pa.begin(), pa.end(), 0);
    }
    int find(int x) {
        if(pa[x] != x)  pa[x] = find(pa[x]);
        return pa[x];
    }
    bool unite(int x, int y) {
        x = find(x);
        y = find(y);
        if(x == y) return false;
        if(rk[x] < rk[y]) {
            pa[x] = y;
        }
        else {
            pa[y] = x;
            if (rk[x] == rk[y]) rk[x]++;
        }
        return true;
    }
};
int main() {
    scanf("%d %d", &n, &m);
    UF uf(n);
    for(int i = 0; i < m; i++) {
        scanf("%d %d", &u, &v);
        if(!uf.unite(u, v)) {
            res ++;
        }
    }
    cout << res;
    return 0;
}

评论

0 条评论,欢迎与作者交流。

正在加载评论...