Dragon Balls
#include <cstdio>
const int maxn = 10010;
int fa[maxn], rank[maxn], cnt[maxn];
int find_root(int p) {
if (p != fa[p]) {
int f = fa[p];
fa[p] = find_root(fa[p]);
cnt[p] += cnt[f];//这里要把源路径到根的所有值都加起来,因此先压缩,后加
}
return fa[p];
}
void Union(int a, int b) {
a = find_root(a), b = find_root(b);
if (a == b) return;
rank[b] += rank[a];
fa[a] = b;
cnt[a]++;
}
int main() {
//freopen("in", "r", stdin);
int T;
int n, m, a, b;
scanf("%d", &T);
char ch[3];
int cas = 1;
while (T--) {
scanf("%d %d", &n, &m);
for (int i = 1; i <= n; i++) {
fa[i] = i, rank[i] = 1, cnt[i] = 0;
}
printf("Case %d:\n", cas++);
while (m--) {
scanf("%s", ch);
if (ch[0] == 'T') {
scanf("%d %d", &a, &b);
Union(a, b);
} else {
scanf("%d", &a);
int u = find_root(a);
printf("%d %d %d\n", u, rank[u], cnt[a] + cnt[u]);
}
}
}
return 0;
}
还是弱爆了啊,自己在计数的时候总是超时,这个抄的代码好使~~

浙公网安备 33010602011771号