【HDU】3635 Dragon Balls (带权并查集 一)

该博客详细介绍了如何利用带权并查集解决HDU 3635题目的算法,包括操作类型、输入输出描述,以及样例输入输出的解释。通过实例解析了数据结构在处理龙珠移动和查询过程中的应用,重点讨论了路径压缩和移动次数的计算方法。
摘要由CSDN通过智能技术生成

题目链接: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])一直延伸向上找到最高的那一个点,然

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值