RT。
#include <bits/stdc++.h>
using namespace std;
#define int long long
int tt;
const int N = 2e5 + 5;
typedef pair <int, int> pii;
int n, m1, m2;
struct dsu {
int f[N];
void pre() {
for (int i = 1; i <= n; i ++) f[i] = i;
}
int findf(int x) {
return x == f[x] ? x : f[x] = findf(f[x]);
}
bool pd(int x, int y) {
x = findf(x), y = findf(y);
return (x == y);
}
int merge(int x, int y) {
x = findf(x), y = findf(y);
if(x == y) return 0;
f[x] = y;
return 1;
}
};
signed main() {
cin >> tt;
while (tt --) {
cin >> n >> m1 >> m2;
int ans = 0;
vector <pii> vec;
for (int i = 1; i <= m1; i ++) {
int a, b;
cin >> a >> b;
vec.push_back({a, b});
}
dsu F, G;
F.pre(), G.pre();
int partf = n, partg = n;
for (int i = 1; i <= m2; i ++) {
int a, b;
cin >> a >> b;
partg -= G.merge(a, b);
}
for (auto p : vec) {
int u = p.first, v = p.second;
if(G.pd(u, v)) {
partf -= F.merge(u, v);
}
else ans ++;
}
ans += partf - partg;
cout << ans << endl;
}
}