【学习笔记】最小直径生成树(MDST)
简介
无向图中某一点(可以在顶点上或边上),这个点到所有点的最短距离的最大值最小,那么这个点就是 图的绝对中心。
无向图所有生成树中,直径最小的一个,被称为 最小直径生成树。
图的绝对中心的求法
下文设 \(d(i, j)\) 为顶点 \(i,j\) 间的最短路径长。
首先我们考虑枚举每一条边 \((u, v)\),长为 \(L\),并假设绝对中心 \(p\) 在这条边上并且距离 \(u\) 长为 \(x(\le L)\)。
对于图中一点 \(i\),\(p\) 到 \(i\) 的距离可以写作 \(d(p, i) = \min(d(u, i) + x,\ d(v, i) + (L - x))\)。
那么显然可以看出 \(d(p, i)\) 的函数图像是一个 两条斜率相同的线段构成的折线段。
于是 \(p\) 到最远点距离的函数可以写作 \(f = \max\limits_{1\le i\le n}\{d(p, i)\}\),图像是一堆折线组成的 更加曲折的 折线,如图(来源):
图中的 \(\alpha\) 即为文中的 \(x\),\(\omega_{u, v}\) 即为 \(L\),\(w_{1\cdots n}\) 为图中异于 \(u, v\) 的点。

那么答案即为图像中的最低点,横坐标即为绝对中心的位置。
如何得到最低点?不难观察到最低点必然是两折线的交点。
对于图中的两点 \(i, j\),若 \(d(u, i) \ge d(u, j)\) 且 \(d(v, i) \ge d(v, j)\),那么显然这个 \(j\) 是丝毫不用考虑的——可以看出 \(d(p, j)\) 的函数图像是完全位于 \(d(p, i)\) 下方的,最低点显然不会在此。
这样筛出的 \(t\) 条折线会有 \(t - 1\) 个交点,那么只要根据这些交点更新答案即可。
\(O(t^2)\) 暴力枚举?大可不必。可以观察到,有一个性质,若我们将这些折线 按 \(d(u, i)\) 的大小 升序排序,那么对应 \(d(v, i)\) 的大小是 递减的。
于是排序后相邻两折线必定会有交点。
图的绝对中心的实现
设 \(adj(i, j)\) 为结点 \(i, j\) 间的直接距离(边长),\(d(i, j)\) 如上文所述,\(rk(i, j)\) 为距离点 \(i\) 第 \(j\) 远的点,\(f\) 即上文的函数。
这里 \(ans\) 表示最远距离。
- 首先使用多源最短路算法(Floyd,Johnson 等)求出 \(d\) 数组。
- 求出 \(rk\),对于每一个 \(i\),按关键字 \(d(i, j)\) 降序排序。
- 然后对于每一个点或边对答案进行更新:
- 可能在点上:对于每一个点 \(i\),用相对较远的点更新:\(ans \leftarrow \min(ans, d(i, rk(i, 1)))\)。
- 可能在边上:对于每一条边 \((i, j)\),从距离 \(i\) 最远的点开始验证——对于所有的 \(k(\le n)\):
- 若 \(d(j, rk(i, k-1)) \le d(j, rk(i, k))\),因为 \(rk\) 是根据 \(d(i, \cdots)\) 排序的,那么两者组合,发现这个对答案无贡献,不能计算,跳过。
- 否则就是 \(f\) 上的一个可能为答案的点(交点)。更新答案:\(ans\leftarrow \min(ans, \dfrac{d(i, rk(i, k)) + d(i, rk(i, k - 1)) + adj(i, j)}{2})\)。
最后 \(ans\) 即为所求。如果需要具体位置需要特别地在更新 \(ans\) 时记录。
复杂度 \(O(n^3 + nm)\) 或 \(O(nm\log n + nm)\),区别在于多源最短路的求法。对于无权图还可以直接 Bfs 得到更优秀的效率。
最小直径生成树(MDST)的求法
根据定义,易知图的绝对中心必定为 MDST 直径的中点。
那么只要得到绝对重心,MDST 并不难求——从绝对中心开始,生成一个最短路径树即为 MDST。
显然 MDST 的直径大小为 \(ans\times 2\)。
习题
- BZOJ 2180 - 最小直径生成树 / SPOJ MDST - Minimum Diameter Spanning Tree 【参考代码】
- SPOJ PT07C - The GbAaY Kingdom 【参考代码】
- Codeforces 266D - BerDonalds
后记
- 原文地址:https://www.cnblogs.com/-Wallace-/p/13483433.html
- 本文作者:@-Wallace-
- 转载请附上出处。
【学习笔记】最小直径生成树(MDST)的更多相关文章
- Hackerrank--Savita And Friends(最小直径生成树MDST)
题目链接 After completing her final semester, Savita is back home. She is excited to meet all her friend ...
- bzoj2180: 最小直径生成树
Description 输入一个无向图G=(V,E),W(a,b)表示边(a,b)之间的长度,求一棵生成树T,使得T的直径最小.树的直径即树的最长链,即树上距离最远的两点之间路径长度. Input 输 ...
- [学习笔记]最小割之最小点权覆盖&&最大点权独立集
最小点权覆盖 给出一个二分图,每个点有一个非负点权 要求选出一些点构成一个覆盖,问点权最小是多少 建模: S到左部点,容量为点权 右部点到T,容量为点权 左部点到右部点的边,容量inf 求最小割即可. ...
- [学习笔记]最小割树(Gomory-Hu Tree)
最小割树(\(\mathcal{Gomory-Hu Tree}\))简明指南 对于单源最短路径,我们有\(SPFA\)和\(Dijkstra\),对于多源最短路径,我们有\(Floyd\):对于两点间 ...
- Spring学习笔记—最小化Spring XML配置
自动装配(autowiring)有助于减少甚至消除配置<property>元素和<constructor-arg>元素,让Spring自动识别如何装配Bean的依赖关系. 自动 ...
- OpenCV 学习笔记03 边界框、最小矩形区域和最小闭圆的轮廓
本节代码使用的opencv-python 4.0.1,numpy 1.15.4 + mkl 使用图片为 Mjolnir_Round_Car_Magnet_300x300.jpg 代码如下: impor ...
- Linux 学习笔记 1 使用最小的系统,从分区安装系统开始
我们常用的linux系统在安装过程中大多都省略了对系统进行分区的操作,以至于后期,不了解什么是分区以及分区当中最基本的一些概念, 我们不说最细的知识,只求了解这个过程,那直接步入正题,开始第一节的学习 ...
- 算法笔记_164:算法提高 最小方差生成树(Java)
目录 1 问题描述 2 解决方案 1 问题描述 问题描述 给定带权无向图,求出一颗方差最小的生成树. 输入格式 输入多组测试数据.第一行为N,M,依次是点数和边数.接下来M行,每行三个整数U,V, ...
- 仙人掌&圆方树学习笔记
仙人掌&圆方树学习笔记 1.仙人掌 圆方树用来干啥? --处理仙人掌的问题. 仙人掌是啥? (图片来自于\(BZOJ1023\)) --也就是任意一条边只会出现在一个环里面. 当然,如果你的图 ...
随机推荐
- Linux安装JAVA并且配置环境
在写之前我先说一下我遇到的坑,我在配置环境的时候由于/etc/profile文件没有配置好导致系统彻底坏掉 1.ls vi等等命令使用不了,报错说找不到命令 2.在重启后虚拟机不能进入桌面 1.下载j ...
- 希捷powerchoice磁盘休眠功能arm打包
官方只提供了x86下面的包,没有提供arm下面的包,而我们的arm机器是32位的,需要编译一个支持armhf的二进制文件,这个文件只需要一个即可,但是编译是整套编译的,并且我们需要选定指定的版本,关闭 ...
- 配置Ceph的IPV6集群
前言 对于IPV6实在是非常的陌生,所以本篇开始会讲一下最基本的网络配置,首先让网络能通起来,最开始就是因为不熟悉IPV6,而直接使用了link local地址,造成了mon部署的时候进程无法绑定到I ...
- K尾相等数(模运算)
Description 从键盘输入一个自然数K(K>1),若存在自然数M和N(M>N),使得K^M^和K^N^均大于或等于1000,且他们的末尾三位数相等,则称M和N是一对"K尾 ...
- 使用Ant将项目打成war包
现在很多项目Java基本都是基于maven管理的,maven对于jar包管理和打包的方便这里就不再赘述,但是如果没有使用maven管理如何将一个Java Web项目打成war包呢,这里推荐使用Ant. ...
- Android 滑动删除控件推荐
implementation 'com.github.mcxtzhang:SwipeDelMenuLayout:V1.3.0' <?xml version="1.0" enc ...
- sqlilab less28 less28a
less-28 less-28a 二者相差不大 单引号小括号包裹,黑名单过滤--,#,空格,union空格select(不区分大小写) less-28的黑名单 less-28a的黑名单 %a0,不被 ...
- webug第四关:告诉你了flang是5位数
第四关:告诉你了flang是5位数 开始看到有点懵 于是不要脸的看源码 burp跑弱口令
- 面试官:小伙子,你给我说一下Java中什么情况会导致内存泄漏呢?
概念 内存泄露:指程序中动态分配内存给一些临时对象,但对象不会被GC回收,它始终占用内存,被分配的对象可达但已无用.即无用对象持续占有内存或无用对象的内存得不到及时释放,从而造成的内存空间浪费. 可达 ...
- 使用Camtasia来给视频或者图片调色
喜欢摄影和制作视频的朋友可能知道,一张好看的照片或一段精美视频的构成要素很多,取景本身就是很重要的条件,相机的硬件水平也是一个重要因素,接下来的就是后期的编辑和处理了,而在后期处理过程中调色是十分重要 ...