D1. Mocha and Diana (Easy Version)

题意:给定两个forest,然后每次操作可以添加一个(i, j)边到两个forest中,但是不能有环,问最多能加几条边,哪几条

思路:树中任意节点加一条边必然有环,所以只能考虑森林中的树跟树之间相连,使用Disjoint set,遍历所有有序对,直接对符合条件的树进行合并并记录边即可。

inline void solve() {
    int n, m1, m2;
    cin >> n >> m1 >> m2;

    Dsu d1(n + 1), d2(n + 2);

    for (int i = 0; i < m1; ++i) {
        int u, v;
        cin >> u >> v;
        d1.unionSet(u, v);
    }

    for (int i = 0; i < m2; ++i) {
        int u, v;
        cin >> u >> v;
        d2.unionSet(u, v);
    }

    vector<pair<int, int>> ans;
    for (int i = 1; i <= n; ++i) {
        for (int j = 1; j <= n; ++j) {
            if (i == j) {
                continue;
            }
            if (d1.findSet(i) != d1.findSet(j) && d2.findSet(i) != d2.findSet(j)) {
                d1.unionSet(i, j);
                d2.unionSet(i, j);
                ans.emplace_back(i, j);
            }
        }
    }

    cout << ans.size() << '\n';
    for (const auto& [x, y] : ans) {
        cout << x << " " << y << '\n';
    }

}
posted @ 2025-11-18 09:48  _Yxc  阅读(5)  评论(0)    收藏  举报