题目:

描述

吉儿是一家古董店的老板娘,由于她经营有道,小店开得红红火火。昨天,吉儿无意之中得到了散落民间几百年的珍宝—月亮之眼。吉儿深知“月亮之眼”价值连城:它是由许多珍珠相连而成的,工匠们用金线连接珍珠,每根金线连接两个珍珠;同时又对每根金线染上两种颜色,一半染成银白色,一半染成黛黑色。由于吉儿自小熟读古籍,所以还晓得“月亮之眼”的神秘传说:“月亮之眼”原是一个古代寺庙的宝物,原本是挂在佛堂的一根顶梁柱上的,整个宝物垂直悬挂,所有珍珠排成一线,且都镶嵌在柱子里,而每一根金线又都是绷紧的,并且金线的银白色一端始终在黛黑色一端的上方;然而,在一个月圆之夜,“月亮之眼”突然从柱里飞出,掉落下来,宝物本身完好无损,只是僧侣们再也无法以原样把“月亮之眼”嵌入柱子中了。吉儿望着这个神秘的宝物,回忆着童年读到的传说,顿时萌发出恢复“月亮之眼”的冲动,但是摆弄了几天依旧没有成功。

现在,要麻烦您来帮助吉儿完成这项使命。

您要设计一个程序,对于给定的“月亮之眼”进行周密分析,然后给出这串宝物几百年前嵌在佛堂顶梁柱上的排列模样。给定的“月亮之眼”有N个珍珠和P根金线,所有珍珠按一定顺序有了一个序号:1、2…、N。

格式

输入格式

输入数据包含一个“月亮之眼”的特征描述:
文件第一行有两个整数N和P,其中N表示宝物中的珍珠个数,P表示宝物中的金线根数;
以下P行描述珍珠连接情况:
文件第I+1行有三个整数,Ri1,Ri2,Li。其中Ri1表示第I根金线的银白色一端连接的珍珠序号;Ri2表示第I根金线的黛黑色一端连接的珍珠序号;Li表示第I根金线的长度。

输出格式

由于珍珠尺寸很小,所以几个珍珠可以同时镶嵌在一个位置上。

您的输出数据描述的是“月亮之眼”各个珍珠在顶梁柱上的位置,输出文件共N行:
第I行,一个整数S,它表示标号为I的珍珠在顶梁柱上距离最高位置珍珠的距离。

注意:若无解则输出仅一行,包含一个整数“-1”。

样例1

样例输入1

9 9
1 2 3
2 3 5
2 7 1
4 5 4
5 6 1
5 9 1
6 7 1
7 8 3
9 8 4

样例输出1

2
5
10
0
4
5
6
9
5

限制

1s

提示

N,P<=500

来源

Balkan OI 1998

思路:

并查集,连接两个珠子就把它们所在的子树合并。fa[]存储祖先节点,d[]存储到祖先节点的距离。

关于判断是否可行:连接两个节点时,如果两个节点x、y在同一棵树上且 d[x]+z!=d[y](z为线的长度),则不可行。因为如果d[x]+z<d[y] 线不够长,d[x]+z>d[y] 时线绷不紧。

关于合并两点:两节点有同一个根节点就不用再连接了(只需判断是否能连接而不需要真的合并)。若连接根节点不同的两节点x、y(x在上),按照并查集的做法就该连接此两点的根节点。而连接根节点是有几种情况:

1、rootx比rooty高

此时,应将rooty连在rootx上且线长为d[x]-d[y]+z。

2、rooty比rootx高

在这种情况下,应将rootx连接在rooty上且线长为d[y]-d[x]-z。

综上:

if(d[x]-d[y]+z>=0) {     fa[rooty]=rootx;d[rooty]=d[x]-d[y]+z;
}
if(d[x]-d[y]+z<0) {fa[rootx]=rooty;d[rootx]=-(d[x]-d[y]+z);
}

因为只能低的节点指向高的节点,所以不能写abs(d[x]-d[y]+z)。

关于find函数中的更新方法:

int find(int x) {if(fa[x]==0) return x;int y=find(fa[x]);d[x]+=d[fa[x]];return fa[x]=y;
}

关于输出:

注意,输出前要把所有的点都find一下。

代码:

#include<cstdio>
#include<algorithm>
#include<iostream>
using namespace std;int n,m;
int d[510]= {0},fa[510]= {0};int find(int x) {if(fa[x]==0) return x;int y=find(fa[x]);d[x]+=d[fa[x]];return fa[x]=y;
}int main() {scanf("%d%d",&n,&m);for(int i=1; i<=m; i++) {int x,y,z;scanf("%d%d%d",&x,&y,&z);int rootx=find(x),rooty=find(y);if(rootx!=rooty) {if(d[x]-d[y]+z>=0) {  //要分类讨论 fa[rooty]=rootx;d[rooty]=d[x]-d[y]+z;}if(d[x]-d[y]+z<0) {fa[rootx]=rooty;d[rootx]=-(d[x]-d[y]+z);}} else {if(d[y]!=d[x]+z) {printf("-1");return 0;}}}for(int i=1; i<=n; i++) {find(i);printf("%d\n",d[i]);}return 0;
}

vijos 1540 月亮之眼 并查集相关推荐

  1. VIJOS 1540 月亮之眼

    描述 吉儿是一家古董店的老板娘,由于她经营有道,小店开得红红火火.昨天,吉儿无意之中得到了散落民间几百年的珍宝-月亮之眼.吉儿深知"月亮之眼"价值连城:它是由许多珍珠相连而成的,工 ...

  2. 方块游戏 (银河英雄传说)(并查集)

    方块游戏 (cubes.pas/c/cpp) [题目描述] 小A和小B在玩一个方块游戏.编号为1到n(1<=n<=30000)的n个方块正放在地上.每个构成一个立方柱. 游戏开始后,小A会 ...

  3. 【宽搜】【并查集】Vijos P1015 十字绣

    题目链接: https://vijos.org/p/1015 题目大意: n*m的网格,线只能在网格的顶点处才能从布的一面穿到另一面.每一段线都覆盖一个单位网格的两条对角线之一,而在绣的过程中,一针中 ...

  4. 货车运输 vijos 1843 NOIP2013 D1T3 最大生成树,并查集,(伪·LCA)

    (本人比较笨,没写LCA,在树上暴力跑过了此题.) 可以证明答案一定在最大生成树上,因为如果答案比最大生成树上的路径更优,那么最大生成树一定不是正确的.反证之. 同时注意到最大生成树过程中是使用了并查 ...

  5. 并查集c++代码_[Leetcode 每日精选](本周主题-并查集) 547. 朋友圈

    题目难度: 中等 原题链接 今天继续来做并查集的问题, 这道题仍然比较基础, 而且也是个比较接近现实的问题了. 大家在我的公众号"每日精选算法题"中的聊天框中回复 并查集 就能看到 ...

  6. HDU1811 Rank of Tetris 拓扑排序+并查集 OR 差分约束最短路+并查集

    题目链接 题意:就是给你一堆关系,看能不能排出个确定的顺序 做法: 1. 拓扑排序+并查集 应该很容易想到的一种思路,大于小于建立单向边.对于相等的呢,就把他们缩成一个点.就用并查集缩成一个点就行了 ...

  7. HDU 2586 How far away ? LCA ---tanjar+并查集 离线算法

    tanjar算法离线求LCA的思想主要是利用并查集的思想. 求距离的话就是d[start[i]]+end[en[i]]-2*d[lca[i]]; 首先从根节点dfs,在深度遍历的回溯的过程中不断的更新 ...

  8. POJ - 2513 Colored Sticks 欧拉通路+并查集+静态树

    一开始想用map来搞,但是感觉好复杂,然后想了一下看大佬们用trie做的,感觉十分合理就敲了一发. 一开始re,数组要开到550000 只会静态的字典树,在每个根节点看是否出现过改颜色,如果没有就把该 ...

  9. 关于 并查集(union find) 算法基本原理 以及 其 在分布式图场景的应用

    二月的最后一篇水文-想写一些有意思的东西. 文章目录 环检测在图数据结构中的应用 深度/广度优先 检测环 并查集数据结构 (Union-Find) 基本概念 初始化 合并 union 查找祖先 优化1 ...

  10. 【BZOJ1015】【JSOI2008】星球大战 并查集

    题目大意 给你一张\(n\)个点\(m\)条边的无向图,有\(q\)次操作,每次删掉一个点以及和这个点相邻的边,求最开始和每次删完点后的连通块个数. \(q\leq n\leq 400000,m\le ...

最新文章

  1. 【蓝桥java】递归基础之振兴中华
  2. anki_Anki如何挽救我的工程生涯
  3. 静态NAT,动态NAT与NAPT区别
  4. 腾讯云携手朋迈推出“综合能源服务平台” 实现能源资源“智慧化”运营
  5. 基于TerraDeveloper的三维GIS开发研究
  6. Java8新特性系列(Lambda)
  7. 分布式消息通信ActiveMQ原理-持久化策略-笔记
  8. 梯度下降法和随机梯度下降法
  9. python比较两张图片是否一样_opencv_判断两张图片是否相同
  10. 绝地求生信号枪只能在服务器吗,绝地求生信号枪怎么用?信号枪刷新点及用法详解...
  11. 数据结构链表之栈,Python3简单实现——5
  12. swiper的基础使用(九)
  13. Facebook 正式开源其大数据查询引擎 Presto
  14. HTTP协议详解(经典)
  15. mysql调查问卷_mysql – 解密数据库ER图用于问卷调查
  16. 学习基于springboot的java分布式中间件-Redis(3) redis之缓存穿透等典型问题
  17. finecms存在任意文件上传漏洞复现
  18. 服务器装win7无限重启吗,win7下机子无限重启解决办法
  19. 数据分析中的漏斗模型
  20. 计算机网络三:运输层

热门文章

  1. 使用starUML一步一步画顺序图
  2. 2018/10/25 模拟赛 纸牌
  3. PSD95抗体研究丨SYSY PSD95抗体结果图展示
  4. 计算机辅助设计基础试题,CAD基础试题「附答案」
  5. Wireshark抓取ping包
  6. badboy设置中文_badboy基本操作
  7. Bad notification for startForeground
  8. lvm 多个硬盘合成一个_linux使用LVM合并硬盘
  9. tableau Fixed函数使用
  10. 培养好习惯是很难,但也有方法