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

  

还是弱爆了啊,自己在计数的时候总是超时,这个抄的代码好使~~
posted @ 2011-07-17 13:09  georgechen_ena  阅读(178)  评论(0)    收藏  举报