作业是鸽子更新的动力。
\(\text{MBST}\)(\(\text{Minimum Bottleneck Spanning Tree}\))指的是求一颗生成树,其中最大的边权最小(所以也叫 \(\text{min-max spanning tree}\))。和最小树形图一样,也有有向图版本(\(\text{MBSA}\))。
MST
考虑到我们求解最小生成树的过程,不难发现 \(\text{MST}\) 就是一个 \(\text{MBST}\)。
假设有一颗 \(\text{MST}\) \(T\)不是 \(\text{MBST}\)。也就是存在一颗生成树 \(T^\prime\),其中所有边权都小于 \(T\) 中最大边权 \(w(e)\),那么考虑在 \(T^\prime\) 却不在 \(T\) 中的边 \(e^\prime\),要么其不与一条包含 \(e\) 的 \(T\) 上路径成环,此时 \(T^\prime\) 也必须选中 \(e\);要么与一条包含 \(e\) 的 \(T\) 上路径成环,此时删去 \(e\),加入 \(e^\prime\) 可以得到比 \(T\) 更小的生成树。综上,可知不存在这样的 \(T^\prime\)。也就是 \(\text{MST}\) 都是 \(\text{MBST}\)。
虽然有线性最小生成树的求法,但是对于 \(\text{MBST}\),我们有更简单的求法。
无向图
考虑图 \(G=\langle V,E\rangle,w:E\mapsto\mathbb{R}\)。我们考虑一个分治的做法,二分边集为 \(E_{l},E_{r}\),满足 \(\forall l\in E_l,r\in E_r,w(l)\le w(r)\) 且 \(E_l\cup E_r=E,||E_l|-|E_r||\le1\)。
随后,我们对于 \(G_l=\langle V,E_l\rangle\) 递归地做,终止条件是边集为空或只有 \(1\) 条边(那么就连边)。如果 \(G_l\) 中已经求出一颗 \(\text{MBST}\),那么我们就不需要考虑 \(E_r\) 中的边了。
否则,\(G_l\) 求解后,\(G\) 会被分成若干连通块 \(c_1,c_2,c_3\ldots c_k\),把每个连通块缩点得到 \(C=\{c_1,c_2,c_3\ldots c_k\}\),然后保留连通块间属于 \(E_r\) 的边,使得 \(\forall e=(u,v)\in E_r\land u\in c_i\land v\in c_j,e^\prime=(c_i,c_j)\in E^\prime,w^\prime(e^\prime)=w(e)\)。然后在新图 \(G^\prime=\langle C,E^\prime\rangle,w^\prime:E^\prime\mapsto\mathbb{R}\) 上递归即可。
看上去这是一个 \(T(|E|)=2T(\frac{|E|}{2})+O(|E|)\Rightarrow T(|E|)=O(|E|\log |E|)\) 的做法,但是可以注意到有一个剪枝。
对于 \(G_l\),我们跑一个 \(O(|V|+|E|)\) 的 \(\text{dfs}\) 就可以判断其是否连通,如果连通就一定可以找到一个生成树没有 \(E_r\) 中的边,那么加入 \(E_r\) 中的边就没有必要;否则瓶颈一定由 \(E_r\) 中的边提供,此时我们只需要计算 \(G^\prime\) 的答案即可。于是 \(T(|E|)=T(\frac{|E|}{2})+O(|V|+|E|)\Rightarrow T(|E|)=O(|V|\log|E|+|E|)\)。
而在 \(\text{dfs}\) 前,若 \(|V|-|E|>1\) 就一定不可能连通,无需 \(\text{dfs}\),于是可以约束到 \(|V|=O(|E|)\),那么此时 \(T(|E|)=T(\frac{|E|}{2})+O(|E|)\Rightarrow T(|E|)=O(|E|)\)。
有向图
和 \(\text{MST}\) 不同,此时我们就不需要关注路径之间的重叠关系了,直接运行最短路的 \(\text{Dijkstra}\) 算法即可,将松弛的 \(d(v)=\min\{d(v),d(p)+w(p,v)\}\) 修改为 \(d(v)=\min\{d(v),\min\{d(p),w(p,v)\}\}\) 即可。运用 \(\text{Fib}\) 堆优化,依然可以做到 \(O(|V|\log|V|+|E|)\),而答案就是所有点的 \(d\) 值中的最大值。