[HDU3635] [2010多校聯考19] Dragon Balls [並查集]
阿新 • • 發佈:2018-11-12
修改和前兩個查詢很顯然的並查集
第三個查詢一開始不知道怎麼搞
仔細想想暴力在路徑壓縮的時候加就好了。
畢竟路徑壓縮是個懶過程。
還是要注意要先合併上面的再傳遞給下面的。小心細節。
#include<cstdio>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<cmath>
#include<set>
#include<ctime>
using namespace std;
int n, q;
char ch;
int fa[10005];
int siz[10005];
int cnt[10005];
int find(int x) {
if (fa[x] == x) {
return x;
}
int tmp = find(fa[x]);
cnt[x] += cnt[fa[x]];
return fa[x] = tmp;
}
void merge(int x, int y) {
int fx = find(x);
int fy = find(y);
if (fx == fy) return;
siz[fy] += siz[fx];
fa[fx] = fy;
++cnt[fx];
}
int main() {
int T;
scanf("%d", &T);
for (int casenum = 1; casenum <= T; ++casenum) {
printf("Case %d:\n", casenum);
scanf("%d%d", &n, &q);
for (int i = 1; i <= n; ++i) {
fa[i] = i;
siz[i] = 1;
cnt[i] = 0;
}
for (int a, b, i = 1; i <= q; ++i) {
scanf(" %c", &ch);
if (ch == 'T') {
scanf(" %d%d", &a, &b);
merge(a, b);
} else {
scanf(" %d", &a);
int fa = find(a);
printf("%d %d %d\n", fa, siz[fa], cnt[a]);
}
}
}
return 0;
}