[算法模板]Kruskal重构树

kruskal重构树是一个很常用的图论算法。主要用于解决u->v所有路径上最长边的最小值,就是找到\(u->v\)的一条路径,使路径上的最长边最小。

图片来自Kruskal重构树学习笔记+BZOJ3732 Network

从上图我们可以看出,kruskal重构树有以下特质:

  • 每个原图上的节点一一对应重构树上的叶子节点。
  • 重构树上每一个其他节点(正方形)代表原图上的一个边,有点权。
  • 重构树是一棵二叉树。
  • 重构树是一个二叉堆。(所以两个叶子节点的LCA即为路径上的最大边)

那如何建树呢?显然,在kruskal基础上搞一搞就行了:

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<algorithm>
  4. #include<vector>
  5. using namespace std;
  6. #define maxn 25000
  7. struct gg{
  8. int u,v,w;
  9. }side1[maxn*2];
  10. vector<int> side2[maxn*4];
  11. bool cop(gg x,gg y){return x.w<y.w;}
  12. int ncnt,num[maxn*4],n,m,k,head[maxn],cnt,dep[maxn*4],f[maxn*4][21],fa[maxn*4];
  13. int get(int x){
  14. if(fa[x]==x)return x;
  15. fa[x]=get(fa[x]);
  16. return fa[x];
  17. }
  18. void uni(int x,int y,int w){
  19. int gx=get(x),gy=get(y);
  20. if(gx==gy)return;
  21. ncnt++;num[ncnt]=w;
  22. side2[ncnt].push_back(gx);side2[ncnt].push_back(gy);side2[gx].push_back(ncnt);side2[gy].push_back(ncnt);
  23. fa[gx]=fa[gy]=fa[ncnt]=ncnt;
  24. return;
  25. }
  26. void dfs(int u,int g){
  27. dep[u]=dep[g]+1;f[u][0]=g;
  28. for(int i=1;i<=20;i++)f[u][i]=f[f[u][i-1]][i-1];
  29. for(int i=0;i<(int)side2[u].size();i++){
  30. int v=side2[u][i];if(v==g)continue;
  31. dfs(v,u);
  32. }
  33. return;
  34. }
  35. int lca(int u,int v){
  36. if(dep[u]<dep[v])swap(u,v);
  37. for(int i=20;i>=0;i--)if(dep[f[u][i]]>=dep[v])u=f[u][i];
  38. if(u==v)return u;
  39. for(int i=20;i>=0;i--)if(f[u][i]!=f[v][i]){u=f[u][i];v=f[v][i];}
  40. return f[u][0];
  41. }
  42. int main(){
  43. scanf("%d%d%d",&n,&m,&k);
  44. for(int i=1;i<=m;i++){
  45. int u,v,w;scanf("%d%d%d",&u,&v,&w);
  46. side1[i]=(gg){u,v,w};
  47. }
  48. for(int i=0;i<=n;i++){fa[i]=i;}
  49. ncnt=n;
  50. sort(side1+1,side1+1+m,cop);
  51. for(int i=1;i<=m;i++){
  52. if(get(side1[i].u)==get(side1[i].v))continue;
  53. uni(get(side1[i].u),get(side1[i].v),side1[i].w);
  54. }
  55. dfs(ncnt,0);
  56. for(int i=1;i<=k;i++){
  57. int a,b;scanf("%d%d",&a,&b);
  58. printf("%d\n",num[lca(a,b)]);
  59. }
  60. return 0;
  61. }

[算法模板]Kruskal重构树的更多相关文章

  1. 算法学习——kruskal重构树

    kruskal重构树是一个比较冷门的数据结构. 其实可以看做一种最小生成树的表现形式. 在普通的kruskal中,如果一条边连接了在2个不同集合中的点的话,我们将合并这2个点所在集合. 而在krusk ...

  2. [洛谷P4768] [NOI2018]归程 (kruskal重构树模板讲解)

    洛谷题目链接:[NOI2018]归程 因为题面复制过来有点炸格式,所以要看题目就点一下链接吧\(qwq\) 题意: 在一张无向图上,每一条边都有一个长度和海拔高度,小\(Y\)的家在\(1\)节点,并 ...

  3. BZOJ 3732 Network 【模板】kruskal重构树

    [题解] 首先,我们可以发现,A到B的所有路径中,最长边的最小值一定在最小生成树上.我们用Kruskal最小生成树时,假设有两个点集U,V,若加入一条边w(u,v)使U,V联通,那么w就是U中每个点到 ...

  4. kruskal重构树学习笔记

    \(kruskal\) 重构树学习笔记 前言 \(8102IONCC\) 中考到了,本蒟蒻不会,所以学一下. 前置知识 \(kruskal​\) 求最小(大)生成树,树上求 \(lca​\). 算法详 ...

  5. Kruskal重构树入门

    这个知识点好像咕咕咕了好长了..趁还没退役赶紧补一下吧.. 讲的非常简略,十分抱歉.. 前置知识 Kruskal算法 一定的数据结构基础(如主席树) Kruskal重构树 直接bb好像不是很好讲,那就 ...

  6. Kruskal重构树学习笔记+BZOJ3732 Network

    今天学了Kruskal重构树,似乎很有意思的样子~ 先看题面: BZOJ 题目大意:$n$ 个点 $m$ 条无向边的图,$k$ 个询问,每次询问从 $u$ 到 $v$ 的所有路径中,最长的边的最小值. ...

  7. 【BZOJ】3732: Network【Kruskal重构树】

    3732: Network Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 2812  Solved: 1363[Submit][Status][Dis ...

  8. 2018.07.18 [NOI2018]归程(return)(kruskal重构树)

    传送门 新鲜出炉的noi2018试题. 下面讲讲这题的解法: 首先要学习一个叫做kruskal重构树的东东. 听名字就知道跟kruskal算法有关,没错,原来的kruskal算法就是用并查集实现的,但 ...

  9. [NOI2018]归程 kruskal重构树

    [NOI2018]归程 LG传送门 kruskal重构树模板题. 另一篇文章里有关于kruskal重构树更详细的介绍和更板子的题目. 题意懒得说了,这题的关键在于快速找出从查询的点出发能到达的点(即经 ...

随机推荐

  1. Eclipse/Idea 代码格式化部分忽略

    有时候我们写一些代码的时候,格式化后,会使代码格式变得不美观.不易读,这里在看一些源码的时候发现有这么一种操作,随手记下 效果 那个代码像以下这样,@formatter:off开启关闭格式化,@for ...

  2. Web应急:门罗币恶意挖矿

    门罗币(Monero 或 XMR),它是一个非常注重于隐私.匿名性和不可跟踪的加密数字货币.只需在网页中配置好js脚本,打开网页就可以挖矿,是一种非常简单的挖矿方式,而通过这种恶意挖矿获取数字货币是黑 ...

  3. 前端学习:JS(面向对象)代码笔记

    前端学习:JS(面向对象)代码笔记 前端学习:JS面向对象知识学习(图解) 创建类和对象 创建对象方式1调用Object函数 <body> </body> <script ...

  4. golang学习笔记---命令源码文件接收参数(flag包)

    命令源码文件怎样接收参数 go标准库中有一个代码包专门用于接收和解析命令参数.这个包叫flag 实例1: package main import ( "flag" "fm ...

  5. STM (软件事务内存)

  6. ElasticSearch 查询索引

    GET iis_qr_2019-07/_search #查询iis_qr_2019-07索引下的所有日志 GET iis_qr_2019-07/_search?_source=c-ip,time #只 ...

  7. 搜索引擎elasticsearch监控利器cat命令

    目录 一.Cat通用参数 二.cat命令 三.示例 查询aurajike索引下的总文档数和有效文档数 查询aurajike各分片的调度情况 一.Cat通用参数 参数名 指令示例 功能 Verbose ...

  8. govendor用法

    为什么使用govendor go语言的依赖管理最主要的是版本控制问题. govendor是Golang的依赖包管理工具,它的出现可以避免不同用户在clone同一个项目后从外部获取不同依赖库版本的问题. ...

  9. 批量操作mysql数据库表

    SELECT CONCAT('truncate TABLE ',table_schema,'.',TABLE_NAME, ';') FROM INFORMATION_SCHEMA.TABLES WHE ...

  10. testNG结果入库

    一.使用IReporter接口 https://blog.csdn.net/oqqJohn1234567890/article/details/80900511  此文章中将结果数据打印成文本.