正题


题目大意

n个点的一棵树,增加了m条密道。对于树上每条边(A,B)(A,B)(A,B)被破坏后,要求A∼BA\sim BA∼B经过密道最短。


解题思路

引理:对于每个道路被破坏,最多只会经过一条边。

证明:对于每个答案,被破坏后,所在层数低的点找到一条可以走出他的子树的边就好了,如果要走两条边,中间的点要不在子树中,要不在子树外。在子树中直接那个点走就好了,在子树外就不用再走了。

证毕
所以我们就只需要找那一条密道就好了,我们考虑用并查集,先将密道长度排好,然后在每一条密道(x,y,w)(x,y,w)(x,y,w),就看一下xxx和yyy之前有没有合并,如果有,就直接用那个答案,如果没有,就合并,用新的答案。


code

#include<cstdio>
#include<algorithm>
#include<cstring>
#define N 100010
using namespace std;
struct node{int to,id,next;
}a[N*2];
struct line{int x,y,w;
}e[N];
int ls[N],tot,x,y,w,ans,dep[N],father[N];
int n,m,S,dfn[N],end[N],cnt,p[N],f[N],d[N];
void addl(int x,int y,int w)//加边
{a[++tot].to=y;a[tot].id=w;a[tot].next=ls[x];ls[x]=tot;
}
bool cmp(line x,line y)
{return x.w<y.w;}
void dfs(int x,int fa)//求深度和父节点,以及每个点对应来的编号
{father[x]=fa;dep[x]=dep[fa]+1;for(int i=ls[x];i;i=a[i].next){int y=a[i].to;if(y==fa) continue;p[y]=a[i].id;dfs(y,x);}
}
int gf(int x)//查找
{return f[x]?f[x]=gf(f[x]):x;}
void doit(int &x,int y)//合并
{d[p[x]]=y;f[x]=gf(father[x]);x=f[x];}
int main()
{scanf("%d%d",&n,&m);memset(d,-1,sizeof(d));for(int i=1;i<n;i++){scanf("%d%d",&x,&y);addl(x,y,i);addl(y,x,i);}for(int i=1;i<=m;i++)scanf("%d%d%d",&e[i].x,&e[i].y,&e[i].w);dfs(1,0);sort(e+1,e+m+1,cmp);//排序for(int i=1;i<=m;i++){int u=gf(e[i].x),v=gf(e[i].y);while(u!=v) doit(dep[u]>dep[v]?u:v,e[i].w);//将所有的点都get}for(int i=1;i<n;i++)printf("%d\n",d[i]);//输出答案
}

nssl1256-C(盟主的忧虑)【并查集】相关推荐

  1. JZOJ 5914. 盟主的忧虑

    Description 江湖由 N 个门派(2≤N≤100,000,编号从 1 到 N)组成,这些门派之间有 N-1 条小道将他们连接起来,每条道路都以"尺"为单位去计量,武林盟主 ...

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

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

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

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

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

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

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

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

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

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

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

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

  8. 并查集 HDOJ 1232 畅通工程

    题目传送门 1 /* 2 并查集(Union-Find)裸题 3 并查集三个函数:初始化Init,寻找根节点Find,连通Union 4 考察:连通边数问题 5 */ 6 #include <c ...

  9. 1013 Battle Over Cities(并查集解法)

    关于背景的介绍见1013 Battle Over Cities(图的DFS解法) DFS就是不算特定结点后数连通子图的总数,再减一.我想着那么并查集就是数不算特定节点后,集合元素(根)的个数.但是我弄 ...

最新文章

  1. 做外挂小记(3)--C#调用读写内存类篇
  2. SQL Server 2008 R2 系统配置检查器的检查参数和妨碍性问题的解决办法
  3. c/c++的“大小,长度
  4. IPC经典入侵,比3389实用(图)
  5. SAP UI5 -all controls within the same view will share the same data Model
  6. 如何使用功能性JavaScript编写经典游戏Snake并在浏览器中播放-完整的代码示例教程
  7. 【转】移动互联网应用测试成长技能树V1.0
  8. 【redis 封装】
  9. css基础知识汇总3
  10. Linux下如何修改ini文件,如何修改Boot.ini文件,重新引导Linux!
  11. ac3168无线网卡驱动下载_REALTEK芯片无线网卡最新驱动!支持到10.15
  12. 新型养老机构的“智安”神器 | ​钛颐康智慧养老物联网平台
  13. 《连线》评出2008年十大最值得关注创业公司
  14. 快速由PCI迁移到PCIe
  15. 什么是SAP Analytics Cloud
  16. Volatility3内存取证工具使用详解
  17. Vue开发实例(11)之el-menu实现左侧菜单导航
  18. oracle 表字段拆分,oracle 字段拆分
  19. Altium Designer 18 导线转换45°的快捷键
  20. Android最牛的开源收集

热门文章

  1. 用gradle启动java项目_构建Java项目
  2. xps13安装linux系统,[操作系统]Dell XPS 13 (9360)安装配置 ubuntu 16.04 实现 win10 Linux双系统...
  3. python数据字符_python数据清洗系列之字符串处理详解
  4. java发送会议邀请邮件模板_Spring 发送邮件 HTML邮件
  5. 《C++ Primer》7.3.2节练习
  6. mysql 3t_编译安装mysql
  7. python二维散点分布图_深入理解皮尔逊相关系数amp;python代码
  8. 线性代数---矩阵的各种问题求解方法
  9. php files得不到导入的文件,PHP判断文件是否被引入的方法get_included_files用法示例...
  10. P2408 不同子串个数 SAM