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

猜你喜欢

转载自blog.csdn.net/Estia_/article/details/83817406