思路来源: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 并查集- 路径压缩,带秩合并的更多相关文章

  1. HDU 3635 并查集+路径压缩+记录每个点移动次数

    题意: 给定n个点 oper个操作 每个点有1个龙珠 下面2种操作: T u v 把u点所有龙珠搬到v Q u  问u点当前所在城市 u点所在城市有几个龙珠 u点被移动几次 思路: 并查集可以求出 u ...

  2. 并查集+路径压缩(poj1988)

    http://poj.org/problem?id=1988 Cube Stacking Time Limit: 2000MS   Memory Limit: 30000K Total Submiss ...

  3. hdu 1558 线段相交+并查集路径压缩

    Segment set Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total ...

  4. 【数轴涂色+并查集路径压缩+加速】C. String Reconstruction

    http://codeforces.com/contest/828/problem/C [题意] [思路] 因为题目保证一定有解,所有优化时间复杂度的关键就是不要重复染色,所以我们可以用并查集维护区间 ...

  5. 并查集 + 路径压缩(经典) UVALive 3027 Corporative Network

    Corporative Network Problem's Link Mean: 有n个结点,一开始所有结点都是相互独立的,有两种操作: I u v:把v设为u的父节点,edge(u,v)的距离为ab ...

  6. 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  输出 ...

  7. LA 并查集路径压缩

    题目大意:有n个节点,初始时每个节点的父亲节点都不存在.有两种操作 I u v:把点节点u的父亲节点设为v,距离为|u-v|除以1000的余数.输入保证执行指令前u没有父亲节点. E u:询问u到根节 ...

  8. snnu(1110) 传输网络 (并查集+路径压缩+离线操作 || 线段树)

    1110: 传输网络 Time Limit: 3 Sec  Memory Limit: 512 MBSubmit: 43  Solved: 18[Submit][Status][Web Board] ...

  9. - > 并查集+路径压缩(详解)(第一节)

    先举一个友爱的例子解释一下并查集: 话说江湖上散落着各式各样的大侠,有上千个之多. 他们没有什么正当职业,整天背着剑在外面走来走去,碰到和自己不是一路人的,就免不了要打一架.但大侠们有一个优点就是讲义 ...

随机推荐

  1. python自学笔记(二)python基本数据类型之字符串处理

    一.数据类型的组成分3部分:身份.类型.值 身份:id方法来看它的唯一标识符,内存地址靠这个查看 类型:type方法查看 值:数据项 二.常用基本数据类型 int 整型 boolean 布尔型 str ...

  2. object-c 内存管理机制的学习

    1.内存的创建和释放 让我们以Object-c世界中最最简单的申请内存方式展开,谈谈关于一个对象的生命周期.首先创建一个对象: //“ClassName”是任何你想写的类名,比如NSString NS ...

  3. (iOS)viewController背景透明化

    #ifdef __IPHONE_8_0 ) { [UIApplication sharedApplication].keyWindow.rootViewController.providesPrese ...

  4. 帝国cms7.2灵动标签万能教程

    学完本文,就完全能掌握帝国模板开发制作啦!这里只介绍sql语句调用方法(方便,快捷!) 灵动标签语法: [e:loop={,24,0}] 模板内容 [/e:loop] 详细解释:黄色部分:条件语句,即 ...

  5. js函数调用模式总结

    在javascript中一共有四种调用模式:方法调用模式.函数调用模式.构造器调用模式和apply调用模式.这些模式在如何初始化关键参数this上存在差异 方法调用模式 当一个函数被保存为对象的一个属 ...

  6. JavaScript 高级程序设计(第3版)笔记——chapter5:引用类型(基本包装类型部分)

    一.介绍 为了方便操作基本类型值,ECMAScript还提供了3个特殊的引用类型:Boolean, Number, String. 实际上,每当读取一个基本类型值得时候,后台就会创建一个对应的基本包装 ...

  7. System.Web.HttpContext.Current.Session为NULL值的问题?

    自定义 HTTP 处理程序,从IHttpHandler继承,在写System.Web.HttpContext.Current.Session["Value"]的时 候,没有问题,但 ...

  8. innerhtml和innertext的用法以及区别

    例如: <div id="test"> <span style="color:red">test1</span> test2 ...

  9. FreeCodeCamp:Slasher Flick

    要求: 打不死的小强! 返回一个数组被截断n个元素后还剩余的元素,截断从索引0开始. 结果: slasher([1, 2, 3], 2) 应该返回 [3]. slasher([1, 2, 3], 0) ...

  10. STL之queue(单向队列)

    单向队列中的数据是先进先出(First In First Out,FIFO).单向队列一共6个常用函数(front().back().push().pop().empty().size()) #inc ...