当前位置: 首页 > 编程日记 > 正文

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

题目链接: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])一直延伸向上找到最高的那一个点,然后再回溯的过程中加上每一个根结点移动的次数,逐个加上,涉及到的点都要进行路径压缩,把相应的点连接到fx上

举个例子:

一组测试数据:

3 4
T 1 2
Q 1
T 1 3
Q 1

第一步:

sum[1] = 1     cnt[1] = 0     pre[1]=1

sum[2] = 1     cnt[2] = 0     pre[2]=2

sum[3] = 1     cnt[3] = 0     pre[3]=3

第二步

在join函数中,find函数没有进行递归,直接返回,fx=1,fy=2,1连到2上,fx(就是x,也就是1)为根结点,移动次数被置为1,pre[1] = 2

第三步:

再次连接的时候,y=3,在调用find函数的时候,直接返回fy=3。但是,x=2,是先一直递归得到fx=2,回溯,退回到x=1,pre[1]=2,cnt[1] += cnt[2],这时候的cnt[2]=0,路径压缩,pre[1]=2,返回2给fx。之后pre[2] =3(得到的状态如上面那幅图所示,将1的根结点连接到3,用题目中的话来说就是将1所在的城市的所有龙珠转移到3城市中,所以3所在的城市的龙珠数量要加上1所在的城市的龙珠的数量,这是1和2在一个城市,之后因为都移走了,所以要置0),sum[3]+=sum[2],sum[2]=0。移动的那个根结点cnt的值置为1。

第四步:

在主函数中,假设要查找的结点是a,root来接受find(a)的值,在调用find函数的同时会进行路径压缩,图的状态会变成上面那种样子,先是x=3,直接返回3给fx,这是x=2了,cnt[2]+=cnt[3](cnt[3]=0,因为没有移动过),pre[2]=3,在返回3给fx,这时候x=1,cnt[1]+=cnt[2],所以cnt[1]变成了2,pre[1]=3,(fx一直接受的返回值都是3),所以,1也连接到3上去了。在最后的输出中,注意保存要查找的根结点就好,前两个输出的数都是要按照根结点来找的,最后一个是根据结点的序号去找的。

只要递归遍历到的点,都会直连到该集合的根节点下,如果遍历到的点还有子树,但是子树上的结点不涉及在这一次递归中,那么就直接一整棵子树连接到该集合的根节点上去。

在回退的过程中,一开始找到的fx(即那个集合的根结点)一直保存在fx中,就是为了pre[x]=fx。

例如要创建的是这样的一棵树,为了看出路径压缩的过程,我们在输入数据的时候,要从下网上输入。

Q 1

     

还是这一种状态,pre[1] = 1,之前都是其他的点的移动,最后是连接到1上,1没有移动过

Q 3

    

在递归的过程中,3,2,1,接着回溯,所以这三个点,最后都会路径压缩,直接连接到1上,像2和3还连接着其他子树,就直接一起,以2和3为根一起带过去了。

之后再Q 3 ,也不会发生改变了,因为已经路径压缩完成,是当前的最优状态了。

之后再试一下Q 4

     

(现在大家可以体会到递归以及路径压缩是怎么一回事了吗)

#include <iostream>
#include <cstring>
#include <cstdio>using namespace std;const int maxn = 10005;int pre[maxn];
int sum[maxn];
int cnt[maxn];
int n,m,root;
char str[3];void init()
{for(int i=0;i<maxn;i++){pre[i] = i;sum[i] = 1;cnt[i] = 0;}
}int find(int x)
{if(x==pre[x])return x;int fx = find(pre[x]);cnt[x] += cnt[pre[x]];pre[x] = fx;return fx;
}void join(int x,int y)
{int fx = find(x);int fy = find(y);if(fy==fx)return ;pre[fx] = fy;sum[fy] += sum[fx];sum[fx] = 0;cnt[fx] = 1;
}int main ()
{int T,k=1,i;int x,y,a;scanf("%d",&T);while(T--){scanf("%d%d",&n,&m);printf("Case %d:\n",k++);init();while(m--){scanf("%s",str);if(str[0]=='T'){scanf("%d%d",&x,&y);join(x,y);}else if(str[0]=='Q'){scanf("%d",&a);root = find(a);/*for(i=1;i<=n;i++){printf("pre[%d]=%d\n",i,pre[i]); }*/printf("%d %d %d\n",root,sum[root],cnt[a]);}/*for(i=1;i<=n;i++){cout << "sum["<<i<<"] = " << sum[i] << ",pre["<<i << "] = "<<pre[i] << ",cnt["<<i<<"] = " << cnt[i]<< endl;}*/}}return 0;
}

相关文章:

php源码安全加密之PHP混淆算法.

php源码安全加密的前世今生,本想发在教程区中.不知道怎么发,就写在这里面吧.PHP加密,解密是一直的话题,本人菜鸟,今天就简单向大家介绍一下并说说其中原理.提供一些加密的混淆算法.一\PHP的加密总体上来说分以下2种:1\扩展组件类加密,代表有:zend\ionCube\SG\php_screw\bcompil…

Element 2.6.0 发布,基于 Vue 2.0 的桌面端组件库

开发四年只会写业务代码&#xff0c;分布式高并发都不会还做程序员&#xff1f; Element 2.6.0 发布了&#xff0c;Element 是一套为开发者、设计师和产品经理准备的基于 Vue 2.0 的桌面端组件库&#xff0c;提供了配套设计资源&#xff0c;帮助你的网站快速成型。由饿了么公…

【Python】随机函数

import random 1、random.random() 2、random.uniform(a,b) 3、random.randint(a,b) 4、random.randrange([start],stop[, step]) 5、random.choice(sequence) 6、random.shuffle(x[, random]) 7、random.sample(sequence,k) import random 1、random.random() 返回随…

IOS/Android模拟器运行APP调试方法

真机不是那么好获取的&#xff0c;模拟器用起来更方便 ios 安装ios-sim 安装 ios-sim&#xff0c;获取 APP 完整的product的文件包。 $ npm i -g ios-sim 启动app # ios-sim launch *.app - -devicetypeid 本地模拟器支持机型类型 id $ ios-sim launch **/BaiduBoxApp.app --d…

python数据结构与算法:单向链表

单链表&#xff1a;python实现及其对应的 增删查检 操作 ##################### P4.1-P4.8 单向链表 ########################### #coding:utf-8 class Node(object):def __init__(self,elem):self.elem elemself.next Noneclass SinglelinkList(object):""&quo…

Vue性能优化:如何实现延迟加载和代码拆分?

移动优先方法已经成为一种标准&#xff0c;但不确定的网络条件导致应用程序快速加载变得越来越困难。在本系列文章中&#xff0c;我将深入探讨我们在Storefront应用程序中所使用的Vue性能优化技术&#xff0c;你们也可以在自己的Vue应用程序中使用它们来实现快速加载。 Webpack…

GitHub怎样fork别人代码到自己仓库并进行贡献

在过程中可能遇到这个问题&#xff1a;https://www.cnblogs.com/q1104460935/p/8275833.html 这个博客应该可以解决 比如说现在有一个很牛逼的项目&#xff0c;我们进入项目地址&#xff0c; 想将这个项目复制到自己的github仓库&#xff0c;然后你还想将 仓库中的代码拉取到…

python数据结构与算法:单向循环列表

单向循环列表&#xff1a;python实现&#xff0c;及其对应的 增删查检 操作 ##################### P4.9-P4.12 循环链表 ########################### #coding:utf-8 class Node(object):def __init__(self,elem):self.elem elemself.next None class SinglecycleList(ob…

http权威指南-http连接管理

2019独角兽企业重金招聘Python工程师标准>>> HTTP连接管理 浏览器解析URL流程&#xff1a; 浏览器解析出域名&#xff1b;浏览器查询这个主机名的IP地址&#xff1b;浏览器获得端口号&#xff1b;浏览器发起到主机名IP地址端口的80连接&#xff1b;浏览器向服务器发…

在macos上基于python2.7安装PyQt5

在macos上基于python2.7安装PyQt5 在python3上面安装PyQt5是十分简单的&#xff0c;可是&#xff0c;在python2.7上安装这个东西&#xff0c;着实让人折腾了一把。要总结一下&#xff0c;年纪大了&#xff0c;记性不好。 首先要安装最新版的Qt和python2&#xff0c;命令如下&am…

python数据结构与算法:二分查找

二分查找&#xff1a;python 实现def binary_seaech(alist,item):"""二分查找 递归实现"""n len(alist)if n > 0:mid n // 2if alist[mid] item:return Trueelif item < alist[mid]:return binary_seaech(alist[:mid],item)else:retur…

使用maven镜像

综述 用maven做项目&#xff0c;最郁闷的莫过于某些依赖库下载不了。被墙了&#xff0c;你懂的。使用maven镜像仓库及其重要&#xff0c;特别是国内的镜像&#xff0c;可以有效缓解被墙疼痛。 常用的镜像 国外镜像 ibiblio.org <mirror> <id>ibiblio</id> &…

Jupyter Notebook 快捷键(基本)

Jupyter Notebook 快捷键 Jupyter Notebook 有两种键盘输入模式。编辑模式&#xff0c;允许你往单元中键入代码或文本&#xff1b;这时的单元框线是绿色的。命令模式&#xff0c;键盘输入运行程序命令&#xff1b;这时的单元框线是灰色。 命令模式 (按键 Esc 开启) Enter : …

关于二叉树的几个必须掌握的实现

The best way to end your fear is to face it yourself. 结束恐惧的最佳办法就是自己面对。本分分享了二叉搜索树的几种实现&#xff0c;由简入繁。说句题外话&#xff0c;马上又是金三银四的季节了&#xff0c;无论跳不跳槽&#xff0c;增加自己的知识储备总是没错的。从代码…

python数据结构与算法:队列与双端队列

双端队列&#xff1a; #################队列#################### #coding:utf-8 """ Deque() 创建一个空的双端队列 add_front(item) 从队头加入一个item元素 add_rear(item) 从队尾加入一个item元素 remove_front() 从队头删除一个item元素 remove_rear() 从…

view5.3登录桌面提示当前可用桌面资源不足

问题描述&#xff1a;用户反馈有个桌面经常提示当前可用桌面资源不足&#xff0c;开始的时候反复重启还可以使用&#xff0c;今天发现彻底无法登录了。解决方法&#xff1a;首先登录到view administrator管理平台查看该桌面发现状态是可用&#xff0c;说明桌面正常&#xff0c;…

【HDU】4706 Children's Day(模拟)

http://acm.hdu.edu.cn/showproblem.php?pid4706 该题没有输入&#xff0c;直接输出不同形状大小的N&#xff0c;在输出不同形状N的时候是要用到26个字母&#xff0c;并且是循环输出 #include <iostream>using namespace std;char map[60][60]; char a[] "abcdef…

详解原生AJAX请求demo(兼容IE5/6)

function createXHR(){ // 检测原生XHR对象是否存在if ( window.XMLHpptRequest ){// 如果存在就返回新实例return new XMLHpptRequest();} else { // 如果不存在就检测ActiveX对象// 兼容IE5/6return new ActiveXObject(Microsoft.XMLHttp);} }// 在所有的浏览器中创建XHR对象…

【POJ】3268 Silver Cow Party (将有向图的边反转)

问题链接&#xff1a;http://poj.org/problem?id3268 【问题描述】 One cow from each of N farms (1 ≤ N ≤ 1000) conveniently numbered 1…N is going to attend the big cow party to be held at farm #X (1 ≤ X ≤ N). A total of M (1 ≤ M ≤ 100,000) unidirectio…

项目管理深入理解08--成本管理

成本管理一章非常的重要&#xff0c;尤其是对于程序员来说&#xff0c;这方面非常的薄弱&#xff0c;但这部分知识无论是在项目管理中还是日常生活中都灰常重要&#xff0c;不然很难成为一个财务自由的程序员。此外&#xff0c;由于财务方面知识点比较多&#xff0c;特增加经济…

python数据结构与算法:双向链表

双向链表&#xff1a; ###################### P4.13-P4. 双向链表 ########################### # import singlelinkListclass Node(object):def __init__(self,item):self.elem itemself.next Noneself.prev None# class DoublelinkList(singlelinkList): #继承 class …

如何开发一个区块链应用程序

区块链是一项巧妙的发明&#xff0c;有望使数字世界更加安全和分散。通过允许数字信息的分发而不是复制&#xff0c;区块链技术创建了一种新型互联网。最初是为数字货币比特币而设计的&#xff0c;现在科技界正在寻找该技术的其他潜在用途。在不久的将来&#xff0c;我们将看到…

python数据结构与算法:栈

栈&#xff1a; Stack() 创建一个新的空栈 push(item) 添加一个新的元素item到栈顶 pop() 弹出栈顶元素 peek() 返回栈顶元素 is_empty() 判断栈是否为空 size() 返回栈的元素个数 Stack() 创建一个新的空栈 push(item) 添加一个新的元素item到栈顶 pop() 弹出栈顶元素 peek(…

【PAT (Basic Level) 】1014 福尔摩斯的约会 (20 分)

大侦探福尔摩斯接到一张奇怪的字条&#xff1a; 我们约会吧&#xff01; 3485djDkxh4hhGE 2984akDfkkkkggEdsb s&hgsfdk d&Hyscvnm大侦探很快就明白了&#xff0c;字条上奇怪的乱码实际上就是约会的时间星期四 14:04&#xff0c;因为前面两字符串中第 1 对相同的…

菜鸟物流云是如何帮助快递合作伙伴解决双11巨大业务负荷的?

物流云双11 双11前&#xff0c;菜鸟物流云共接入12家合作伙伴&#xff0c;全部参加双11大促活动&#xff0c;作为物流云的首次双11&#xff0c;尤其是经过了快递公司的大考经验&#xff0c;事实证明项目是靠谱的。 双11前已经整体上云的快递合作伙伴2家&#xff0c;韵达和天天&…

安装H3C的各种问题

HCL安装完成后&#xff0c;启动HCL失败&#xff1b;提示&#xff1a;“当前系统用户名中包含非ASCII字符”问题&#xff1f;HCL只能安装装在英文路径下&#xff0c;如果用户名为中文或者安装路径有中文目录&#xff0c;就会出现此问题&#xff0c;请确保系统用户名和安装路径中…

前景背景分割——ostu算法的原理及实现 OpenCV (八)

OpenCV 【八】——前景背景分割——ostu算法的原理及实现 实验结果代码实现实现原理参考资料实验结果 代码实现 #include<opencv2/opencv.hpp> #include<iostream> using namespace std; using namespace cv; //计算图像灰度直方图 Mat calcgrayhist(const Mat&am…

【PAT (Basic Level) 】1015 德才论 (25 分)

宋代史学家司马光在《资治通鉴》中有一段著名的“德才论”&#xff1a;“是故才德全尽谓之圣人&#xff0c;才德兼亡谓之愚人&#xff0c;德胜才谓之君子&#xff0c;才胜德谓之小人。凡取人之术&#xff0c;苟不得圣人&#xff0c;君子而与之&#xff0c;与其得小人&#xff0…

浏览器启动外部软件

常可以看见使用浏览器代码启动本地应用的软件.例如qq、迅雷、等等.那么他们是怎么做到的呢? 它的奥秘:Register protocol 前言我们经常看到 tencent://..thunder://这两种开头的网址&#xff0c;往往觉得很奇怪&#xff0c;很想弄懂其中的原理&#xff0c;是如何实现的&#x…

Luogu P1082 同余方程(NOIP 2012) 题解报告

题目传送门 【题目大意】 求关于x的同余方程 ax≡1(mod b)的最小整数解。 【思路分析】 由同余方程的有关知识可得&#xff0c;ax≡1(mod b)可以化为axby1&#xff0c;此方程有解当且仅当gcd(a,b)1&#xff0c;于是就可以用欧几里得算法求出一组特解x0&#xff0c;y0。 那么x0就…