题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3635
【问题描述】
有标号为1到n的n个龙珠,分别放在对应标号为1到n的n个城市里。
下面有两种操作:
T A B表示把A龙珠所在城市的所有龙珠都转移到B龙珠所在的城市中
Q A 表示查询A,需要知道A龙珠现在所在的城市,A所在的城市有几颗龙珠,A转移到这个城市移动了多少次,分别输出3个整数,表示上述信息。
【输入描述】
第一行一个整数T表示测试数据组数T∈[0,100]
对于每一组测试数据,第一行包含两个整数N,Q∈[2,10000]
接下来Q行,每行包含如下的操作或询问:T A B或Q A,如题目描述所示。
【输出描述】
对于每一组测试数据,先输出一行Case x:(x表示测试数据标号,从1开始),然后对于每一个询问,输出一行三个数表示答案,用空格隔开
【样例输入】
2
3 3
T 1 2
T 3 2
Q 2
3 4
T 1 2
Q 1
T 1 3
Q 1
【样例输出】
Case 1:
2 3 0
Case 2:
2 2 1
3 3 2
开三个数组
pre数组:pre[i]表示第i个球所在的城市
sum数组:sum[i]表示第i个城市所拥有的球的个数
cnt数组:cnt[i]表示第i个球移动了几次
init():初始化,每一个球原来都呆在自己的城市,所以每一个城市里都只有1个球,每一个球的移动次数都是0。
如果输入的是T,x,y,则find函数找到x和y的根结点,在find函数递归的时候,先是一直延伸向下,找到它的根结点fx,然后在回溯的过程中修改cnt数组(即cnt[i]表示第i个球移动的次数)以及进行压缩路径。
某一个球移动的次数 = 他自己移动的次数 + 它上面的根结点移动的次数 ,所以find(pre[x])一直延伸向上找到最高的那一个点,然