克鲁斯卡尔重构树小结

https://zybuluo.com/ysner/note/1239639

定义

克鲁斯卡尔重构树可以维护诸如“查询从某个点出发经过边权不超过\(w\)的边最远所能到达的节点”或“从某点到某点所有路径的最长边的最小值”之类的问题。

总之,算法处理范围有限,且多为同时包含“最大最小”、离线可二分的题目。

可与数据结构结合,以维护更复杂的数据结构。

它可以在线回答,复杂度为\(O(logn)\)。

构建

把边权从大到小排序,用给两端点(两个联通块)新建一个权值为边权的共同父亲,来代表给它们加了一条边。

性质

  • 树上除叶子结点以外的点都对应着原来生成树中的边,叶子结点就是原来生成树上的节点。
  • 由于新点的创建顺序与原来生成树上边权的大小有关(从大到小),可以发现,从每个点到根节点上除叶子结点外按顺序访问到的点的点权是单调的。
  • 出于\(kruskal\)算法贪心的性质,两个点\(u\)和\(v\)的\(lca\)的点权就对应着它们最小生成树上的瓶颈。
  • 实际上这棵树就是一个二叉堆。

    相关题目

  • [X] [bzoj3732]network
  • [X] [NOI2018]归程
  • [ ] [ONTAK2010]Peaks加强版

原文地址:https://www.cnblogs.com/yanshannan/p/9434159.html

时间: 2024-10-11 21:54:37

克鲁斯卡尔重构树小结的相关文章

[您有新的未分配科技点][BZOJ3545&BZOJ3551]克鲁斯卡尔重构树

这次我们来搞一个很新奇的知识点:克鲁斯卡尔重构树.它也是一种图,是克鲁斯卡尔算法求最小生成树的升级版首先看下面一个问题:BZOJ3545 Peaks. 在Bytemountains有N座山峰,每座山峰有他的高度h_i.有些山峰之间有双向道路相连,共M条路径,每条路径有一个困难值,这个值越大表示越难走. 现在有Q组询问,每组询问询问从点v开始只经过困难值小于等于x的路径所能到达的山峰中第k高的山峰,如果无解输出-1.N<=1e5,M,Q<=5*1e5 上面这个题没有要求在线,因此我们可以离线构造

克鲁斯卡尔重构树

大佬博客定义克鲁斯卡尔重构树可以维护诸如"查询从某个点出发经过边权不超过的边最远所能到达的节点"或"从某点到某点所有路径的最长边的最小值"之类的问题.总之,算法处理范围有限,且多为同时包含"最大最小".离线可二分的题目. 可与数据结构结合,以维护更复杂的数据结构. 它可以在线回答,复杂度为O(logn) 构建把边权从大到小排序,用给两端点(两个联通块)新建一个权值为边权的共同父亲,来代表给它们加了一条边. 性质树上除叶子结点以外的点都对应着原来生

P4197 Peaks [克鲁斯卡尔重构树 + 主席树]

部分kruskal重构树内容摘抄于bzt神仙的blog Problem 在\(Bytemountains\)有\(n\)座山峰,每座山峰有他的高度\(h_i\) .有些山峰之间有双向道路相连,共\(M\)条路径,每条路径有一个困难值,这个值越大表示越难走,现在有\(Q\)组询问,每组询问询问从点\(v\)开始只经过困难值小于等于\(x\)的路径所能到达的山峰中第\(k\)高的山峰,如果无解输出\(-1\). kruskal重构树是用来解决一些诸如"查询从某个点开始 经过边权不超过\(val\)所

笛卡尔树及克鲁斯卡尔重构树

笛卡尔树 好东西, 可以用于最大(小)值分治, 在\(O(n)\)的时间复杂度内建出一个节点为区间最大值的树, 每次分治时走小区间可以保证\(O(nlog_n)\)的复杂度 建树时维护极右链, 他的中序遍历即原序列 代码 #include<bits/stdc++.h> using namespace std; const int N=1e5+10; int n,v[N],fa[N],ls[N],rs[N]; int s[N],top; void Tree() { for(int i = 1;

【BZOJ 3551】[ONTAK2010] Peaks加强版 Kruskal重构树+树上倍增+主席树

这题真刺激...... I.关于Kruskal重构树,我只能开门了,不过补充一下那玩意还是一棵满二叉树.(看一下内容之前请先进门坐一坐) II.原来只是用树上倍增求Lca,但其实树上倍增是一种方法,Lca只是他的一种应用,他可以搞各种树上问题,树上倍增一般都会用到f数组. |||.我们跑出来dfs序就能在他的上面进行主席树了. IV.别忘了离散. V.他可能不连通,我一开始想到了,但是我觉得出题人可能会是好(S)人(B),但是...... #include <cstdio> #include

【BZOJ 3545】【ONTAK 2010】Peaks &amp; 【BZOJ 3551】【ONTAK 2010】Peaks加强版 Kruskal重构树

sunshine的A题我竟然调了一周!!! 把循环dfs改成一个dfs就可以,,,我也不知道为什么这样就不会RE,但它却是A了,,, 这周我一直在调这个题,总结一下智障错误: 1.倍增的范围设成了n而不是n*2-1,,, 2.重构树的顶点是n*2-1,而我一开始设成了n,,, 3.define里的for3和for4的i--打成i++,,,,,,,,,,,, 4.dfs爆栈了,找CA爷问的编译命令里手动扩栈,真是愚蠢的问题,,,, 比赛时绝不会有太多时间,在这么犯逗就得滚粗了QAQ 3545: #

45. 蛤蟆的数据结构笔记之四十五克鲁斯卡尔算法

本篇名言:"假如生活欺骗了你 ,不要忧郁 , 也不要愤慨 !不顺心的时候暂且容忍 : 相信吧 , 快乐的日子就会到来.--普希金" 上两篇学习了弗洛伊德和迪杰特斯拉算法.这次来看下克鲁斯卡尔算法. 欢迎转载,转载请标明出处:http://write.blog.csdn.net/postedit/47071539 1.  克鲁斯卡尔算法 克鲁斯卡尔(Kruskal)算法是在剩下的所有未选取的边中,找最小边,如果和已选取的边构成回路,则放弃,选取次小边.是实现图的最小生成树最常用的算法.

最小生成树(普利姆算法、克鲁斯卡尔算法)

给定一个加权无向连通图,如何选择一个生成树,使权利的最小总和的边缘所有树,叫最小生成树. 求最小生成树算法 (1) 克鲁斯卡尔算法 图的存贮结构採用边集数组,且权值相等的边在数组中排列次序能够是随意的.该方法对于边相对照较多的不是非常有用,浪费时间. (2) p=1313">普里姆算法 图的存贮结构採用邻接矩阵.此方法是按各个顶点连通的步骤进行,须要用一个顶点集合,開始为空集,以后将以连通的顶点陆续增加到集合中,所有顶点增加集合后就得到所需的最小生成树 . 以下来详细讲下: 克鲁斯卡尔算法

克鲁斯卡尔(模板题)

http://acm.hdu.edu.cn/showproblem.php?pid=1372 以前真二,模板题 OJ真奇怪,有时能A有时W, #include <iostream> #include <stdio.h> #include <string.h> #include <stdlib.h> using namespace std; struct node { int x,y,z; }q[100*101/2+1]; int m,n; int sum=0