P2078 朋友

简简单单的并查集,再加上模拟合并找值

#include<bits/stdc++.h>
using namespace std;
const int N = 2e5 + 7;
int f1[N], f2[N];
int u1[N], u2[N], v1[N], v2[N];
int ans1[N], ans2[N];
int find1 (int x) { return f1[x] == x ? x : f1[x] = find1 (f1[x]); }
int find2 (int x) { return f2[x] == x ? x : f2[x] = find2 (f2[x]); }
int main(){
int n, m, p, q;
scanf("%d%d%d%d", &n, &m, &p, &q);
for(int i = 1;i <= max(n, m);i ++)
f1[i] = f2[i] = i, ans1[i] = ans2[i] = 1;
for(int i = 1;i <= p;i ++)
scanf("%d%d", &u1[i], &v1[i]);
for(int i = 1;i <= q;i ++)
scanf("%d%d", &u2[i], &v2[i]), u2[i] *= -1, v2[i] *= -1;
for(int i = 1;i <= p;i ++){
int fx = find1 (u1[i]), fy = find1 (v1[i]);
if(fx != fy){
ans1[fy] += ans1[fx];
f1[fx] = fy;
ans1[fx] = 0;
}
}
for(int i = 1;i <= q;i ++){
int fx = find2 (u2[i]), fy = find2 (v2[i]);
if(fx != fy){
ans2[fy] += ans2[fx];
f2[fx] = fy;
ans2[fx] = 0;
}
}
printf("%d", min(ans1[find1(1)], ans2[find2(1)]));
return 0;
}

posted @ 2022-10-31 18:56  feuerwerk  阅读(22)  评论(0)    收藏  举报