经过很多次的修改 终于以 703ms ac 了。
思路:建立一个没有路劲压缩的并查集,在建的过程中用一个数组cs[]记录每个城中的龙珠数目;
用一个k来记录某个龙珠被移动的次数;
吸收换行时要注意 我错了很多次;
#include <iostream>
#include <cstdio>
using namespace std;
int f[10005], k, cs[10005];//cs[]每个城中的龙珠;
int n_n, n;//n_n所求的龙珠;
int find_fa(int x)//建立并查集,但不路径压缩,为了容易求出某个龙珠转移的次数;
{
k++;
if(x != f[x]) x = find_fa(f[x]);//没有路径压缩;
return x;
}
int main()
{
int t, d = 0;
scanf("%d", &t);
while(t--)
{
d++;
k = 0;
int m;
scanf("%d%d", &n, &m);
getchar();//吸收换行;
for(int i = 1; i <= n; i++)//初始化,
{
f[i] = i;
cs[i] = 1;
}
printf("Case %d:\n", d);
for(int i = 0; i < m; i++)
{
char ch;
int u, v;
scanf("%c", &ch);
if(ch == 'T')
{
scanf("%d%d", &u, &v);
u = find_fa(u);
v = find_fa(v);
k = 0;//k到最后的计算龙珠移动的次数才有用,这里没有用所以一直赋值为0;
if(u != v)
{
f[u] = v;
cs[v] += cs[u];//如果不在同一个父节点,那么就把u城中的龙珠给v城中的龙珠;
}
getchar();
}
else if(ch == 'Q')
{
scanf("%d", &u);
k = 0;
n_n = find_fa(u);
getchar();
printf("%d %d %d\n", n_n, cs[n_n], k-1);
}
}
}
return 0;
}