加载中...

信息奥赛题单|并查集


并查集

题单 🧑🏻‍💻

题目来源 题目名称 题目链接 备注 难度
HDU - 1856 More is better 链接🔗 并查集求集合元素最大值 🟢

题解 🚀

More is better

题目信息 📚

【题目名称】HDU P1856 - More is better
【题目描述】

Mr Wang wants some boys to help him with a project. Because the project is rather complex, the more boys come, the better it will be. Of course there are certain requirements.

Mr Wang selected a room big enough to hold the boys. The boy who are not been chosen has to leave the room immediately. There are 100000 boys in the room numbered from $1$ to $100000$ at the very beginning. After Mr Wang’s selection any two of them who are still in this room should be friends (direct or indirect), or there is only one boy left. Given all the direct friend-pairs, you should decide the best way.

【输入】

The first line of the input contains an integer $n (0 \le n \le 100 000)$ - the number of direct friend-pairs.

The following n lines each contains a pair of numbers $A$ and $B$ separated by a single space that suggests $A$ and $B$ are direct friends. $

【输出】

The output in one line contains exactly one integer equals to the maximum number of boys Mr Wang may keep.

【输入样例】
4
1 2
3 4
5 6
1 6
4
1 2
3 4
5 6
7 8
【输出样例】
4
2
【原题链接】

https://vjudge.net/problem/HDU-1856


题目解析 🍉

【题目分析】

并查集の模版题

【C++ 代码】
#include<bits/stdc++.h>

using namespace std;
typedef long long LL;
const int N = 1e5 + 10;
int pre[N], cnt[N], n, a, b;

// 并查集初始化
void init() {
    for (int i = 1; i < N; i++) {
        pre[i] = i;
        cnt[i] = 1;
    }
}

// 查找编号为x的元素所在集合
int find(int x) {
    if (x != pre[x]) pre[x] = find(pre[x]);
    return pre[x];
}

// 合并两个集合
void join(int a, int b) {
    int xa = find(a);
    int xb = find(b);
    if (xa != xb) {
        pre[xa] = xb;
        cnt[xb] += cnt[xa];
    }
}

int main() {
    ios::sync_with_stdio(false);  //cin读入优化
    cin.tie(0);

    while (cin >> n) {
        init();  // 并查集初始化
        for (int i = 1; i <= n; i++) {
            cin >> a >> b;
            join(a, b);  // 合并
        }

        // 输出集合元素数量最大值
        int res = 0;
        for (int i = 1; i < N; i++) res = max(res, cnt[i]);
        cout << res << endl;
    }

    return 0;
}

参考资料 📚


文章作者: Rickyの水果摊
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Rickyの水果摊 !
  目录