杭电1213——并差集
原题传送门
这道题和杭电1232几乎一样,杭电1232详解,大佬并差集详解。
ac代码
#include <iostream>
#include <cstring>
using namespace std;
int f[1005];
int r[1005];
void init() {
for (int i = 0; i < 1005; i++) f[i] = i;
memset(r, 0, sizeof(r));
}
int fin(int x) {
return x == f[x] ? x : fin(f[x]);
}
void merge(int a, int b) {
int fa = fin(a);
int fb = fin(b);
if (r[fa] < r[fb]) f[fa] = fb;
else {
f[fb] = fa;
if (r[fa] == r[fb]) r[fa]++;
}
}
bool same(int a, int b) {
return fin(a) == fin(b);
}
int main() {
//ios::sync_with_stdio(false);
//freopen("in.txt", "r", stdin);
int T; cin >> T;
while (T--) {
int m, n; cin >> n >> m;
int cnt = n;
init();
while (m--) {
int a, b; cin >> a >> b;
if (!same(a, b)) {
merge(a, b);
cnt--;
}
}
cout << cnt << endl;
}
return 0;
}