HDU 3635 Dragon Balls 七龙珠 Union Find算法
来源:互联网 发布:大数据薪资待遇 编辑:程序博客网 时间:2024/06/06 01:08
孙悟空要寻找七龙珠,这回是七龙珠的增强版了,因为这些龙珠会衍生,最后不止七颗龙珠了。
悟空带着布玛的龙珠雷达探测器出发了,却发现布玛的龙珠雷达探测器的程序太垃圾了,所以找到我们这些ACM高手为龙珠雷达探测器写个程序,要求可以显示某颗龙珠所在的城市的位置,该龙珠所在的城市共有多少颗龙珠,龙珠移动过的次数。
布玛是个有钱人啊,写个程序我要价5百万,不算过分吧。因为本程序需要用到Union Find(并查集)算法,而且最困难的部分是如何压缩路径,不压缩路径自然容易做到,要压缩路径可以使得程序加快很多,故此要价5百万,O(∩_∩)O哈哈~。
路径压缩的思路是:
增加一个额外的移动记录次数,方便查找父母节点的时候更新孩子节点。
压缩路径之后程序块上100ms+;效果还是可以的。
不压缩路径的话,就直接接在一棵树上,计算移动次数的时候,直接计算到父母节点的距离就可以了。
Union Find的灵活运用,优化好的话,达到5星级难度的题目。
#include <stdio.h>const int MAX_N = 10001;struct Subset{int xp, yNumBall, zTrans, addTrans;};Subset subs[MAX_N];int N;void initSubs(){for (int i = 1; i <= N; i++){subs[i].xp = 0;subs[i].yNumBall = 1;subs[i].zTrans = 0;subs[i].addTrans = 0;//the main help for path compression}}int findParent(int x)//with path compression{if (subs[x].xp)//do not use 0 index.{int p = subs[x].xp;subs[x].xp = findParent(p);//update parentsubs[x].zTrans += subs[p].addTrans;//careful:Update transportation timessubs[x].addTrans += subs[p].addTrans;//Watch out: +=, not =return subs[x].xp;}return x;}int findParent_2(int x)//without path compression{int p = x;if (subs[x].xp)//do not use 0 index.{p = findParent(subs[x].xp);//update parentsubs[x].zTrans = subs[subs[x].xp].zTrans+1;//Update transportation times}return p;}void unionTwo(int x, int y){int xp = findParent(x);int yp = findParent(y);if (xp == yp) return ;subs[xp].xp = yp;//It should be yp, not y. add to its parent directlysubs[yp].yNumBall += subs[xp].yNumBall;//only record balls in parentsubs[xp].addTrans++;//transportation happen, add one more transsubs[xp].zTrans++;//Watch out: update self's trans}int main(){int T, Q, a, b;//N cities and balls, Q questschar cmd;scanf("%d", &T);for (int t = 1; t <= T; t++){scanf("%d %d", &N, &Q);initSubs();printf("Case %d:\n", t);while (Q--){getchar();// get rid of '\n'scanf("%c %d", &cmd, &a);if (cmd == 'T'){scanf("%d", &b);unionTwo(a, b);}else{int ap = findParent(a);printf("%d %d %d\n", ap, subs[ap].yNumBall, subs[a].zTrans);}//balls recorded in parent, trans times recorded in self node}}return 0;}
1 0
- HDU 3635 Dragon Balls 七龙珠 Union Find算法
- hdu 3635 Dragon Balls
- HDU-3635 Dragon Balls
- HDU 3635 Dragon Balls
- HDU-3635-Dragon Balls
- hdu 3635 Dragon Balls
- HDU 3635 Dragon Balls
- HDU 3635 Dragon Balls
- HDU 3635 Dragon Balls
- HDU 3635 Dragon Balls
- hdu 3635 Dragon Balls
- hdu 3635 Dragon Balls
- HDU - 3635 Dragon Balls
- HDU 3635 Dragon Balls
- HDU 3635 Dragon Balls
- 3635 HDU Dragon Balls
- hdu 3635 Dragon Balls
- hdu-3635 Dragon Balls
- 忘记密码
- 图表控件TeeChart干货分享(绘制2D、3D实时曲线---VC++示例源代码--网络首发)
- POJ 3185 The Water Bowls(高斯消元,枚举变元)
- Swift初见
- 2012年9月15日锐捷网络嵌入式研发笔试
- HDU 3635 Dragon Balls 七龙珠 Union Find算法
- Android 高手进阶之自定义View,自定义属性(带进度的圆形进度条)
- Python查找文件内容
- linux 常用查看系统配置命令
- 虚函数相关问题分析
- Spark Web界面
- POJ--1122--FDNY to the Rescue!【最短路】
- 各种操作系统上的操作系统日志位置
- Unable to instantiate Action, MenuAction, defined for 'QueryMenuAll' in namespace '/'MenuAction