这里的坑不少
女生是负数,数组下标有负数,所以要先变成正数,但是直接并查集会出现男生女生重合,编号相同,所以要把女生映射到+n上,这样就完美
cpp#include <iostream>
#include <vector>
using namespace std;
const int maxn = 500000;
int father[maxn];
int find(int x) {
if (father[x] != x) {
father[x] = find(father[x]);
}
return father[x];
}
void unionn(int x, int y) {
int root_x = find(x);
int root_y = find(y);
if (root_x != root_y) {
father[root_y] = root_x;
}
}
int main() {
int n, m, p, q;
cin >> n >> m >> p >> q;
for (int i = 1; i <= n + m; ++i) {
father[i] = i;
}
for (int i = 1; i <= p; ++i) {
int a, b;
cin >> a >> b;
if (find(a) != find(b)) {
unionn(a, b);
}
}
for (int i = 1; i <= q; ++i) {
int a, b;
cin >> a >> b;
a *= -1;
b *= -1;
if (find(a + n) != find(b + n)) {
unionn(a + n, b + n);
}
}
int ansm = 0, ansf = 0;
for (int i = 1; i <= n; ++i) {
if (find(i) == find(1)) {
ansm++;
}
}
for (int i = n + 1; i <= n + m; ++i) {
if (find(i) == find(n + 1)) {
ansf++;
}
}
int result = min(ansm, ansf);
cout << result << endl;
return 0;
}
本文作者:yowayimono
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!