正题

题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=3732


题目大意

一张图,每次询问两个点,求这两个点之间路径的最大值的最小是多少。


解题思路

构造一颗KruskalKruskalKruskal重构树然后就是模板了。


codecodecode

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=2e5+10;
struct node{int x,y,w;
}e[N];
struct edge_node{int to,next;
}a[N];
int n,m,k,tot,cnt,root,ls[N],val[N];
int top[N],dep[N],siz[N],son[N],fa[N];
void addl(int x,int y)
{a[++tot].to=y;a[tot].next=ls[x];ls[x]=tot;
}
bool cmp(node x,node y)
{return x.w<y.w;}
int find(int x)
{return (fa[x]==x)?x:(fa[x]=find(fa[x]));}
void dfs1(int x)
{for(int i=ls[x];i;i=a[i].next){int y=a[i].to;if(y==fa[x]) continue;dep[y]=dep[x]+1;fa[y]=x;dfs1(y);siz[x]+=siz[y];if(siz[y]>siz[son[x]])son[x]=y;}
}
void dfs2(int x)
{if(son[x]){top[son[x]]=top[x];dfs2(son[x]);}for(int i=ls[x];i;i=a[i].next){int y=a[i].to;if(y==fa[x]||y==son[x]) continue;top[y]=y;dfs2(y);}
}
int LCA(int x,int y)
{while(top[x]!=top[y]){if(dep[top[x]]<dep[top[y]])swap(x,y);x=fa[top[x]];}if(dep[x]<dep[y]) return x;else return y;
}
int main()
{scanf("%d%d%d",&n,&m,&k);for(int i=1;i<=m;i++)scanf("%d%d%d",&e[i].x,&e[i].y,&e[i].w);for(int i=1;i<=n+m;i++)fa[i]=i;sort(e+1,e+1+m,cmp);cnt=n;for(int i=1;i<=m;i++){int fx=find(e[i].x),fy=find(e[i].y);if(fx!=fy){fa[fy]=fa[fx]=++cnt;addl(cnt,fx);addl(cnt,fy);addl(fx,cnt);addl(fy,cnt);val[cnt]=e[i].w;}}root=find(1);dfs1(root);top[root]=root;dfs2(root);for(int i=1;i<=k;i++){int x,y;scanf("%d%d",&x,&y);printf("%d\n",val[LCA(x,y)]);}
}

bzoj3732-Network【Kruskal重构树模板】相关推荐

  1. Network 黑暗爆炸 - 3732 倍增lca || Kruskal重构树

    传送门 文章目录 题意: 思路: 题意: 思路: 两点间最长边最小值一定是最小生成树上两点间的最大值,这个比较容易证,就不多说了. 知道这个结论后, 我们直接跑一个KruskalKruskalKrus ...

  2. 浅谈kruskal重构树

    食用须知: *因为临时改动,代码不一定完全正确. *以下概念来自个人理解,并不十分准确.慎! <Kruskal重构树思想与模板> Kruskal算法(维护无向图的最小生成森林):每一时刻, ...

  3. Kruskal重构树 学习笔记

    Kruskal重构树 学习笔记 文章目录 Kruskal重构树 学习笔记 前言 例题1 BZOJ3732 Network 例题2 [NOI2018] 归程 前言 Kruskal重构树是一种比较冷门的算 ...

  4. kruskal 重构树(讲解 + 例题)

    kruskal重构树 如何建树 模仿kruskalkruskalkruskal,先将所有边排序. 依次遍历每一条边,如果这条边的两个节点(u,vu, vu,v)不在同一个连通块里面, 则新建一个nod ...

  5. Kruskal 重构树

    Kruskal 重构树 kruskal 最小生成树算法相信大家已经很熟悉了,所以这里就不介绍了.顾名思义 kruskal 重构树就是根据 kruskal 改造一下衍生出来的算法.它能解决下面这样的一个 ...

  6. 洛谷P4768 [NOI2018]归程(Kruskal重构树)

    题意 直接看题目吧,不好描述 Sol 考虑暴力做法 首先预处理出从$1$到每个节点的最短路, 对于每次询问,暴力的从这个点BFS,从能走到的点里面取$min$ 考虑如何优化,这里要用到Kruskal重 ...

  7. 【NOI 2018】归程(Kruskal重构树)

    题面在这里就不放了. 同步赛在做这个题的时候,心里有点纠结,很容易想到离线的做法,将边和询问一起按水位线排序,模拟水位下降,维护当前的各个联通块中距离$1$最近的距离,每次遇到询问时输出所在联通块的信 ...

  8. [ONTAK2010] Peaks加强版 (kruskal重构树+主席树+倍增)

    Peaks description solution code description 在Bytemountains有N座山峰,每座山峰有他的高度h_i 有些山峰之间有双向道路相连,共M条路径,每条路 ...

  9. [NOI2018] 归程(线段树维护并查集的可持久化/kruskal重构树,倍增+dijkstra最短路)

    [NOI2018] 归程 description solution1 code1 solution2 code description 题目描述 本题的故事发生在魔力之都,在这里我们将为你介绍一些必要 ...

最新文章

  1. 全局稳定性收敛平衡点为0吗_神经网络的稳定性阐明.pdf
  2. android theme 错误,为什么修改android:theme就崩溃,求助
  3. 《C# 程序员的自我修养》送书活动结果公布
  4. linux脚本嵌套,linux shell 嵌套expect 与服务器交互脚本
  5. go string 转 uint64_如何优雅的使用Go接口?
  6. Oracle share server
  7. 一维数状数组区间修改,查询
  8. 如何得到当前程序执行的堆栈
  9. uos系统安装教程_统一操作系统UOS下载&安装图文教程:尝鲜记(一)
  10. 逆radon变换matlab,Radon变换及其Matlab代码实现
  11. 萨达萨达发神鼎飞丹砂
  12. Android重力感应
  13. has no attribute _TensorLike
  14. 虚拟机中c#程序提示flash组件未注册解决方案
  15. word中参考文献编号添加及更新方法
  16. base64编码类源代码(C#)
  17. ssm私人牙科诊所病例管理系统的设计与实现毕业设计源码071128
  18. 服务器重启后,docker安装的mysql怎么重启
  19. Python实战案例:旅游方面博文的数据分析
  20. 【180627】VC++坦克大决战源码(音效+地图)

热门文章

  1. 微型计算机原理中LEA,微型计算机系统原理及应用(第2版)第2章
  2. oracle中的的instr,Oracle中instr函数使用方法
  3. arcgis批量处理nc文件_气象数据处理——nc文件
  4. php 下拉表单,PHP表单和填充下拉列表问题
  5. tankwar java_TankWar 单机(JAVA版) 版本0.3 画出坦克
  6. php判断子字符串位置,PHP怎样查询子字符串位置
  7. labuladong 的算法小抄_关于算法笔试的几个套路,一点就透
  8. 7-2 旅行售货员 (10 分)(TSP问题思路加详解)
  9. [JavaWeb-MySQL]SQL基本概念,通用语法,分类
  10. C++pair对组的创建