修改和前两个查询很显然的并查集
第三个查询一开始不知道怎么搞
仔细想想暴力在路径压缩的时候加就好了。
毕竟路径压缩是个懒过程。
还是要注意要先合并上面的再传递给下面的。小心细节。
#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;
}