社区讨论

求助

P2078朋友参与者 1已保存回复 0

讨论操作

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

当前回复
0 条
当前快照
1 份
快照标识符
@mhj30tgt
此快照首次捕获于
2025/11/03 19:54
4 个月前
此快照最后确认于
2025/11/03 19:54
4 个月前
查看原帖
代码如下,个人感觉可能是初始化或者遍历出了问题,但是好像最大的编号不等于最大的人数啊所以哪怕只有两个人编号也可以是 1 和 10000000;然后就不会写了:( 求助大佬
CPP
#include <bits/stdc++.h>
using namespace std;

int n, m, p, q;
map<int, int> f; // 并查集的父节点映射
int man, wm;     // 统计连通分量中的男性和女性数量

// 查找函数,带路径压缩和动态初始化
int find(int x) {
    if (f.find(x) == f.end()) {
        f[x] = x; // 如果节点不存在,先初始化
    }
    if (f[x] == x) {
        return x;
    } else {
        return f[x] = find(f[x]); // 路径压缩
    }
}

// 合并函数
void unite(int x, int y) {
    int rx = find(x);
    int ry = find(y);
    if (rx != ry) {
        f[ry] = rx; // 合并集合
    }
}

int main() {
    cin >> n >> m >> p >> q;
    
    // 处理男性朋友关系
    while (p--) {
        int x, y;
        cin >> x >> y;
        unite(x, y);
    }
    
    // 初始化小明和小红的节点
    f[1] = 1;
    f[-1] = -1;
    
    // 处理女性朋友关系
    while (q--) {
        int x, y;
        cin >> x >> y;
        unite(x, y);
    }
    
    // 连接小明和小红
    unite(1, -1);
    
    // 找到小明的根节点
    int root = find(1);
    
    // 统计连通分量中的男性和女性数量
    for (auto &tmp : f) {
        int node = tmp.first;
        if (find(node) == root) {
            if (node > 0) {
                man++;
            } else if (node < 0) {
                wm++;
            }
        }
    }
    
    // 取最小值作为答案
    int ans = min(man, wm);
    cout << ans << '\n';
    
    return 0;
}

回复

0 条回复,欢迎继续交流。

正在加载回复...