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';
}
}

浙公网安备 33010602011771号