HDOJ 3635 并查集- 路径压缩,带秩合并
思路来源:http://blog.csdn.net/niushuai666/article/details/6990421
题目大意:
初始时,有n个龙珠,编号从1到n,分别对应的放在编号从1到n的城市中。
现在又2种操作:
T A B,表示把A球所在城市全部的龙珠全部转移到B城市。(第一次时,因为A球所在的城市只有一个球,所以只移动1个,如果有多个,则全部移动)。
Q A,表示查询A。要求得到的信息分别是:A现在所在的城市,A所在城市的龙珠数目,A转移到该城市移动的次数(如果没有移动就输出0)
解题思路:
并查集的应用。但是这道题让我纠结了很久,首先是转移次数怎么确定,经过思考,我们可以开一个辅助数组,当转移一次时,我们就把要转移的城市的全部龙珠的转移次数全部做+1操作。但是遇到的问题就是超时问题,我们需要遍历全部龙珠,找出要转移的城市的全部龙珠然后才能够+1,这样,很容易就超时了。
反复想了很久,想了另一个办法,就是通过路径压缩来更新转移的次数,比如每次移动时,我只需要把这个城市的根结点的转移次数+1,等到以后路径压缩时,子结点自己移动的次数加上根结点移动的次数,就是这个结点总共的移动次数,不明白的可以自己动手画画。。
另一个蛋疼的问题就是printf。。。上面那个问题纠结了10几分钟就搞定了,这个问题一下子搞了3个小时,快悲剧死。。。。。。。
不过也算不错,知道printf是倒序输出的,它默认的输出是从右到左,当最右边的变量受前面变量的影响时,答案肯定错误,因为它先计算的是最右边的值。。。好吧,我承认自己C语言学的还不行,要不然也不会在这里翻船了。。。看来一些简单的东西也是值得研究的。。。ORZ!~
通过这道题,对并查集的查找又有了一定的认识,初步理解了路径压缩的好处,这里,根结点的转移次数不是直接加上根结点的移动次数,而是在路径压缩的过程中逐层累加,比如有4层,根结点为1,然后第二层2,第三层3,第四层4.那么,第一层路径压缩过程中进入第二层,然后第三层,然后第四层,第四层也就是根,找到根结点,返回第三层,第三层+上第四层的转移次数,然后返回第二层,第二层转移次数加上第三层转移次数,返回第一层,第一层转移次数加上第二层转移次数,同时,在这个过程中也把下面3层的结点的父节点直接更新为和根结点,也就是1相连,查找结束后,称为2层结构,根结点1在一层,234都处于第二层。这样的一个过程是通过递归调用本身完成的,跟数据结构(严蔚敏版本)讲解栈那节的汉诺塔过程相似,如果想完全掌握,推荐仔细看教材+自己模拟,这样就可以理解了。。。。。
#include <stdio.h>
#define MAXSIZE 10011 int root[MAXSIZE], rank[MAXSIZE], num[MAXSIZE];
void init(){
for(int i = ; i < MAXSIZE; ++i){
root[i] = i, rank[i] = , num[i] = ;
}
}
int find(int x){
if(root[x] == x) return x;
int t = root[x];
root[x] = find(root[x]);
num[x] += num[t];
return root[x];
}
void Union(int x, int y){
int ra = find(x);
int rb = find(y);
root[ra] = rb;
rank[rb] += rank[ra];
num[ra] = ;
}
int main(){
int t, i, j, n, q, a, b, caseNum = ;
char cmd;
scanf("%d",&t);
while(t--){
printf("Case %d:\n",++caseNum);
init();
scanf("%d%d",&n,&q);
while(q--){
getchar();
scanf("%c ",&cmd);//使用cin会爆时间
if(cmd == 'T'){
scanf("%d%d",&a,&b);
Union(a,b);
}
else{
scanf("%d",&a);
int t = find(a);
printf("%d %d %d\n",t,rank[t],num[a]);
}
}
}
return ;
}
HDOJ 3635 并查集- 路径压缩,带秩合并的更多相关文章
- HDU 3635 并查集+路径压缩+记录每个点移动次数
题意: 给定n个点 oper个操作 每个点有1个龙珠 下面2种操作: T u v 把u点所有龙珠搬到v Q u 问u点当前所在城市 u点所在城市有几个龙珠 u点被移动几次 思路: 并查集可以求出 u ...
- 并查集+路径压缩(poj1988)
http://poj.org/problem?id=1988 Cube Stacking Time Limit: 2000MS Memory Limit: 30000K Total Submiss ...
- hdu 1558 线段相交+并查集路径压缩
Segment set Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total ...
- 【数轴涂色+并查集路径压缩+加速】C. String Reconstruction
http://codeforces.com/contest/828/problem/C [题意] [思路] 因为题目保证一定有解,所有优化时间复杂度的关键就是不要重复染色,所以我们可以用并查集维护区间 ...
- 并查集 + 路径压缩(经典) UVALive 3027 Corporative Network
Corporative Network Problem's Link Mean: 有n个结点,一开始所有结点都是相互独立的,有两种操作: I u v:把v设为u的父节点,edge(u,v)的距离为ab ...
- Never Wait for Weights(带权并查集+路径压缩)
题目链接:http://acm.sdibt.edu.cn/vjudge/contest/view.action?cid=2209#problem/F !a b w 表示b比a大w ? a b 输出 ...
- LA 并查集路径压缩
题目大意:有n个节点,初始时每个节点的父亲节点都不存在.有两种操作 I u v:把点节点u的父亲节点设为v,距离为|u-v|除以1000的余数.输入保证执行指令前u没有父亲节点. E u:询问u到根节 ...
- snnu(1110) 传输网络 (并查集+路径压缩+离线操作 || 线段树)
1110: 传输网络 Time Limit: 3 Sec Memory Limit: 512 MBSubmit: 43 Solved: 18[Submit][Status][Web Board] ...
- - > 并查集+路径压缩(详解)(第一节)
先举一个友爱的例子解释一下并查集: 话说江湖上散落着各式各样的大侠,有上千个之多. 他们没有什么正当职业,整天背着剑在外面走来走去,碰到和自己不是一路人的,就免不了要打一架.但大侠们有一个优点就是讲义 ...
随机推荐
- 02-C语言执行过程
目录: 一.MACOS系统操作 二.C语言的使用方式 三.编码 四.编译 五.运行 六.分析第一个C程序 七.预处理指令#include 八.完整执行过程 回到顶部 一.MACOS系统操作 操作计算机 ...
- 关于 free() 函数用法的若干疑问
<C语言参考手册>中关于 free() 函数有如下描述. (1)free() 函数的原型 void free(void *ptr); (2)free 函数对以前由 malloc.callo ...
- 基于FPGA的信号消抖
上一篇写了一个按键消抖,按键消抖需要一个计数器.可是有些信号是不需要这么负责的,仅仅是抖动而已.于是我在上一篇博文的基础上做了一点修改,于是有了这个信号消抖的程序 module sig_nojitte ...
- 64位linux下安装oracle10 64位 遇到 :ins_ctx.mk ;ins_emdb.mk
http://blog.csdn.net/bamuta/article/details/10523835 http://www.cnblogs.com/kerrycode/p/3519446.html ...
- 用Mediawiki做百科网站资源大参考
MediaWiki简易安装教程**关于mediawiki 一些好的资料: http://codex.wordpress.org.cn/Mediawiki%E5%BB%BA%E7%AB%99%E7%BB ...
- VC使用CRT调试功能来检测内存泄漏
信息来源:csdn C/C++ 编程语言的最强大功能之一便是其动态分配和释放内存,但是中国有句古话:“最大的长处也可能成为最大的弱点”,那么 C/C++ 应用程序正好印证了这句话.在 C/C+ ...
- [转载]cin、cin.get()、cin.getline()、getline()、gets()函数的用法
1.cin>> 用法1:最基本,也是最常用的用法,输入一个数字: #include <iostream>using namespace std;main ( ...
- 未能加载文件或程序集“DAL”或其他的某一个依赖项,系统找不到指定的文件
针对这个问题我在敲VB.NET机房收费系统的时候总共出现了两次,第一次是在使用反射+抽象工厂的时候出现的,第二次是在使用VS2012自带的打包工具生成可执行文件执行exe文件的时候出现的.具体看下图: ...
- java Script 中的keyCode 和charCode
其实很长一段时间,我都没有完全弄明白keyCode 和charCode ,自己也认真看过,但是就是理解不透彻,为了防止以后再出现混乱,写篇博客记录一下吧! 首先 在不同的浏览器中,他们有不同的说法哦 ...
- js 解析XML 在Edge浏览器下面 无法准确读到节点属性值
js 解析XML 在Edge浏览器下面 无法准确读到节点属性值 Dom.documentElement.childNodes[j].attributes[2] 这个是大众写法 在win10的edge ...