1. 程式人生 > >[HDU3635] [2010多校聯考19] Dragon Balls [並查集]

[HDU3635] [2010多校聯考19] Dragon Balls [並查集]

[ L i n k \frak{Link} ]


修改和前兩個查詢很顯然的並查集
第三個查詢一開始不知道怎麼搞
仔細想想暴力在路徑壓縮的時候加就好了。
畢竟路徑壓縮是個懶過程。
還是要注意要先合併上面的再傳遞給下面的。小心細節。


#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; }