UVA 1329 Corporative Network(并查集:路径压缩)
UVA 1329 Corporative Network(并查集:路径压缩)
2014年03月09日 00:19:33
阅读数:914
UVA 1329 Corporative Network(并查集:路径压缩)
题意:
初始时有n个点(编号1到n),每个点都没有父节点,然后依次执行下面两条命令:
I u v :把节点u的父亲设置为v,并且设u节点到v的距离为|u-v|%1000,输入保证执行I命令的时候,u没有父节点。
E u:查询u节点到根节点的距离。
输入:首先是T,表示实例个数。每个实例第一行是n(5<=n<=20000),接下有不超过200000行,每行一个指令,以单独的O字母行表示结束。
输出:对于每条E指令,输出查询结果。
分析:
本题连通分量的节点不仅要维护fa信息,还需要维护dist信息。
其中fa[i]表示i节点的直属父亲节点编号,dist[i]表示i节点到它直属父亲节点的距离。在每次findset(i)操作后,将i节点连接到当前连通分量的根节点下面,并且更新dist[i]的值。其实就是比普通的并查集操作多了一个相对距离的概念。
注意:每次查询u节点到根节点距离前,需要findset(u)操作,这样才能让u节点放在其所属连通分量的根节点下面。
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=20000+5;//路径压缩并查集
int fa[maxn];
int dist[maxn];
int findset(int x)
{if(fa[x]==-1) return x;int root = findset(fa[x]);dist[x] += dist[fa[x]];return fa[x] = root;
}int main()
{int T;scanf("%d",&T);while(T--){int n;scanf("%d",&n);for(int i=1;i<=n;i++){fa[i]=-1;dist[i]=0;}char str[100];while(scanf("%s",str)==1 && str[0]!='O'){if(str[0]=='I'){int u,v;scanf("%d%d",&u,&v);fa[u]=v;dist[u]= abs(u-v)%1000;}else if(str[0]=='E'){int u;scanf("%d",&u);findset(u);printf("%d\n",dist[u]);}}}return 0;
}
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int MAXN=20000+100;
int d[MAXN];//点到根节点的距离
int pa[MAXN];//父节点
int findset(int x)//查询x的根节点,并且使得d[x]变成x到根的距离
{if(x==pa[x])return x;int root = findset(pa[x]);//执行完这句,pa[X]到根的距离已经是d[pa[x]]了d[x]=d[x]+d[pa[x]];return pa[x]=root;
}int main()
{int T;scanf("%d",&T);while(T--){int n;scanf("%d",&n);for(int i=0;i<=n;i++){pa[i]=i;d[i]=0;}char op[20];while(scanf("%s",op)){if(op[0]=='O')break;else if(op[0]=='I'){int u,v;scanf("%d%d",&u,&v);pa[u]=v;d[u]=abs(u-v)%1000;}else if(op[0]=='E'){int u;scanf("%d",&u);findset(u);printf("%d\n",d[u]);}getchar();//读/n}}return 0;
}
UVA 1329 Corporative Network(并查集:路径压缩)相关推荐
- Rochambeau POJ - 2912 (枚举和加权并查集+路径压缩)找唯一裁判
题意:有n个人玩石头剪刀布,有且只有一个裁判.除了裁判每个人的出拳形式都是一样的. a<b表示b打败a,a=b表示a和b出拳一样,平手.a>b表示a打败b. 给出m个回合的游戏结果,问能否 ...
- UVA 1329——Corporative Network
题意:有n个节点,然后执行I u,v(把u的父节点设为v)和E u(询问u到根节点的距离). 思路:并查集.加了信息的并查集,在路径压缩的同时维护距离d[i]; code: #include < ...
- 并查集路径压缩_并查集(UnionFind)技巧总结
什么是并查集 在计算机科学中,并查集是一种树型的数据结构,用于处理一些不交集(Disjoint Sets)的合并及查询问题.有一个联合-查找算法(Union-find Algorithm)定义了两个用 ...
- 并查集 路径压缩(具体解释)
拿HDU 1232举例. 题解: 首先在地图上给你若干个城镇,这些城镇都能够看作点,然后告诉你哪些对城镇之间是有道路直接相连的.最后要解决的是整幅图的连通性问题.比方任意给你两个点.让你推断它们是否连 ...
- 并查集路径压缩_第二十五天:并查集
今天是释然发题解的第二十五天,以后会经常和大家分享学习路上的心得,希望和大家一起进步,一起享受coding的乐趣 本文约1400字,预计阅读5分钟 昨天我们学习了动态规划之线性规划,忘记的小伙伴们可以 ...
- 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 输出 ...
- 并查集路径压缩和按rank合并代码实现
1.子集结构体:parent为每个子集的根,rank为秩 struct Subset {int parent;int rank; }; 2.初始化: 一开始每个顶点自成一个子集,它们的parent指向 ...
- POJ 2236 Wireless Network 并查集
Wireless Network 并查集 Crawling in process... Crawling failed Time Limit:10000MS Memory Limit:6553 ...
- CF-1023F.Mobile Phone Network(并查集缩点)
CF-1023F.Mobile Phone Network(并查集缩点) 题目链接 题意 你手里有K条边还没有分配权值,已经存在M条边带权值,如何给你手中的边分配权值,使得K条边都在最后的最小生成树中 ...
最新文章
- linux 下 C 编程和make的方法 (十、C版的try catch 捕捉段错误和异常处理)
- asp.net三层架构详解
- macaca使用中问题解决方法整理
- 格力发布公告称双11期间让利30亿元打击低质伪劣产品
- linux下查看CPU、内存、磁盘信息
- DeepLab图像分割
- Qt 实现Windows系统Win10 c++音量调节
- python输入数字输出月份英文缩写_英文和数字表示的月份,如何在 Excel 中相互转换?...
- pitfall when implementing multiple interfaces
- 莫纳什大学计算机专业排名,澳大利亚大学计算机专业排名
- android 开源远程工具项目scrcpy 简单使用
- ob集群安装部署相关
- [转载]17岁高考落榜生成为世界顶尖IT高手
- ESP32开发之旅——ssd1306 OLED屏的使用
- 支付宝/小钱袋H5支付通道
- iPhone的解锁、越狱、激活、固件等等是什么意思,有什么分别?(转)
- 前端高频面试题-非框架
- 计算机感染木马或病毒,电脑中木马病毒的症状
- java如何实现qq分组_QQ好友分组小程序
- 一文搞懂均匀分布、高斯分布、瑞利分布、莱斯分布(含MATLAB代码)
热门文章
- threadlocal使用场景_ThreadLocal有没有内存泄漏?源码给你安排得明明白白
- nginx websocket wss 连接失败 failed_浅谈WebSocket协议、WS协议和WSS协议原理及关系
- python从入门到精通 pdf 完整超清版-Python从入门到精通PDF高清完整版免费下载|百度云盘...
- python工资一般多少西安-python西安薪资
- python自学-我是如何自学 Python 的
- python-Python教程
- 学python后到底能干什么-学Python后到底能干什么
- 学python可以从事什么工作-学完Python能从事哪些工作?
- python创建txt文件并写入-python如何将数据写入本地txt文本文件
- python 下载文件-Python实现HTTP协议下的文件下载方法总结