图算法—Problem M
2016-07-06 22:35
183 查看
图算法—Problem M
题意
有n个人坐在zjnu体育馆里面,然后给出m个他们之间的距离, A B X, 代表B的座位比A多X. 然后求出这m个关系之间有多少个错误,所谓错误就是当前这个关系与之前的有冲突。
解题思路
(1)弄清题意,找出出现冲突的位置,判断冲突很简单: 就是当两个人在同一行坐同时, 他们到根节点的距离差值正好是他们之间的距离差值。如果和测试数据不同,此时就出现了冲突了。
(2)关键有两个地方,这也是并查集题目的难点,1、路径压缩,2、合并时候求被合并根节点到新根节点的距离。
路径压缩在递归过程中计算每个节点到根的距离: dist[x] += dist[fx];
合并过程 fy合并到fx
p[fy]=fx;
dist[fy]=-dist[y]+d+dist[x];
感想
并查集深层应用,比较难,不行还是参考了下网上的代码,哎···
AC代码
题意
有n个人坐在zjnu体育馆里面,然后给出m个他们之间的距离, A B X, 代表B的座位比A多X. 然后求出这m个关系之间有多少个错误,所谓错误就是当前这个关系与之前的有冲突。
解题思路
(1)弄清题意,找出出现冲突的位置,判断冲突很简单: 就是当两个人在同一行坐同时, 他们到根节点的距离差值正好是他们之间的距离差值。如果和测试数据不同,此时就出现了冲突了。
(2)关键有两个地方,这也是并查集题目的难点,1、路径压缩,2、合并时候求被合并根节点到新根节点的距离。
路径压缩在递归过程中计算每个节点到根的距离: dist[x] += dist[fx];
合并过程 fy合并到fx
p[fy]=fx;
dist[fy]=-dist[y]+d+dist[x];
感想
并查集深层应用,比较难,不行还是参考了下网上的代码,哎···
AC代码
#include<cstdio> #include<cstring> #include<iostream> #include<string> #include<algorithm> using namespace std; const int maxn=50000+5; int p[maxn], dist[maxn]; //dist存储的是相对于父节点的距离 void make_set() { memset(p, -1, sizeof(p)); memset(dist, 0, sizeof(dist)); } int find_set(int x) { if(p[x]==-1) return x; int fx=p[x]; p[x]=find_set(p[x]); dist[x]+=dist[fx]; return p[x]; } void union_set(int x, int y, int d) { int fx=find_set(x), fy=find_set(y); if(fx==fy) return; p[fy]=fx; dist[fy]=-dist[y]+d+dist[x]; } int main() { int n, m; int a, b, x; int ans; while(scanf("%d%d", &n, &m)!=EOF) { ans=0; make_set(); while(m--) { scanf("%d%d%d", &a, &b, &x); if(find_set(a)==find_set(b)) { if(dist[b]-dist[a]!=x) { //printf("a=%d b=%d x=%d, dist[b]-dist[a]=%d\n", a, b, x, dist[b]-dist[a]); ans++; } } else union_set(a, b,x); } printf("%d\n", ans); } return 0; }
相关文章推荐
- webgis、gis学习技巧总结
- python高级编程---->深刻理解Python中的元类(metaclass)
- Maven+Tomcat的热部署方案
- Maven+Tomcat的热部署方案
- 搜索引擎指令
- SQL转Java代码小工具
- 校验用户输入
- XML
- 修改XenServer无法上传超过4G的ISO(适用于安装XenServer前)
- python虚拟环境
- HDU 2254 - 奥运
- [C#6] 5-自动属性增强
- 堆排序法(c/c++实现)
- 使用Gson解析复杂的json数据
- HDU 4908/BC B BestCoder Sequence
- Fragment
- 9针串口引脚定义 25针串口引脚定义
- unreachable code 报错
- GCC编译过程
- 系统自带功能之相机