原题链接
1 题目
1.1 题目所需求出内容
对于本题,最终要求:一个具体值
1.2 题目背景、允许、禁止与限制
背景:
有一张图,nnn 个设备和 mmm 条物理连接,第 iii 条物理连接有一个权值 wiw_iwi
允许:
对于从设备 AAA 到设备 BBB 的一条经过了若干个物理连接的路径,我们记这条路径的稳定性为其经过所有连接中稳定性最低的那个
我们记设备 AAA 到设备 BBB 之间通信的稳定性为 AAA 至 BBB 的所有可行路径的稳定性中最高的那一条
求任意两点之间的通信稳定性(若不存在道路,则输出 −1-1−1)
1.3 题目数据范围与猜测
O(n log m)O(n~log~m)O(n log m)
1.4 一句话概括题意
有一张无向带权图
求任意两点所有路径经过边中最小值最大是多少
2 题目破题推导
2.1 第一步:正向思维转逆向思维
我们考虑将“最小值最大”转化,变为一张图的最大生成树上两点之间最小的那条边
2.2 第二步:证明
命题:一张图上的节点 AAA 到 BBB 之间所有路径经过边中最小值的所有可能中的最大值 === 一张图的最大生成树中 AAA
设无向图 G=(V,E)G=(V,E)G=(V,E),每条边 e∈Ee\in Ee∈E 拥有边权 w(e)w(e)w(e)。
对图中任意两点 A,BA,BA,B,定义
f(A,B)=maxP 是G中A→B的路径{ mine∈Pw(e) }f(A,B)=\max_{\substack{P\text{ 是}G\text{中}A\to B\text{的路径}}} \Big\{\;\min_{e\in P} w(e)\;\Big\} f(A,B)=P 是G中A→B的路径 max {e∈Pmin w(e)}
f(A,B)f(A,B)f(A,B) 的含义:枚举 AAA 到 BBB 的全部路径,每条路径取路径上边权的最小值,再对这些最小值取最大值。
设 TTT 是图 GGG 的一棵最大生成树,PTP_TPT 代表树 TTT 上 AAA 到 BBB 的唯一路径。记
valT=mine∈PTw(e)val_T=\min_{e\in P_T} w(e) valT =e∈PT min w(e)
求证:
f(A,B)=valT\boldsymbol{f(A,B)=val_T} f(A,B)=valT
证明:
* 第一步:证明 f(A,B)≥valTf(A,B)\ge val_Tf(A,B)≥valT
最大生成树 TTT 的所有边都来自原图 GGG,因此树上路径 PTP_TPT 也是原图中一条合法的 A→BA\to BA→B 路径。
根据 f(A,B)f(A,B)f(A,B) 的定义:f(A,B)f(A,B)f(A,B) 是所有合法路径的 min{w(e)}\min\{w(e)\}min{w(e)} 的最大值。集合的最大值一定大于等于集合中任意一个元素。把路径 PTP_TPT 纳入考虑,得到
f(A,B) ≥ mine∈PTw(e)=valTf(A,B)\;\ge\; \min_{e\in P_T}w(e) = val_T f(A,B)≥e∈PT min w(e)=valT
* 第二步:证明 f(A,B)≤valTf(A,B)\le val_Tf(A,B)≤valT (反证法)
反设 f(A,B)>valTf(A,B) > val_Tf(A,B)>valT 。
根据 f(A,B)f(A,B)f(A,B) 的定义,则原图中一定存在某条路径 P′P'P′,满足
mine∈P′w(e)=X>valT\min_{e\in P'} w(e) = X > val_T e∈P′min w(e)=X>valT
该式等价于路径 P′P'P′ 的每一条边权都满足 w(e)≥X>valTw(e)\ge X>val_Tw(e)≥X>valT 。
回顾最大生成树的Kruskal算法:边按权值从大到小排序,依次加入,不构成环则保留。
valTval_TvalT 是树上 A,BA,BA,B 路径的最小边权,也就是树上 A,BA,BA,B 正是依靠这条权为 valTval_TvalT 的边才完成连通。
但路径 P′P'P′ 的全部边权都严格大于 valTval_TvalT ,说明在Kruskal处理完所有权大于 valTval_TvalT 的边时,AAA 与 BBB 就已经连通。
此时权值为 valTval_TvalT 的边不再起到连通两个连通块的作用,按照Kruskal规则,这条边不会被选入最大生成树。
这与“权值为 valTval_TvalT 的边属于最大生成树 TTT 的 A−BA-BA−B 路径”矛盾。
故假设不成立,因此
f(A,B)≤valTf(A,B)\le val_T f(A,B)≤valT
合并不等式
联立
{f(A,B)≥valTf(A,B)≤valT\begin{cases} f(A,B)\ge val_T\\ f(A,B)\le val_T \end{cases} {f(A,B)≥valT f(A,B)≤valT
得到
f(A,B)=valT\boldsymbol{f(A,B)=val_T} f(A,B)=valT
3 模型匹配
最大生成树用最小生成树模板改一下(排序改为降序)
树上 AAA 到 BBB 的最小值用LCA。但是我们发现题目中并没有提到“图一定连通”,说明可能会有森林,但是依旧在原数组上做LCA即可
4 最终代码(禁止抄袭,仅用于参考)
易错点:
LCA的初始化dfs传入的时候第二个参数(根节点的父亲)应该是 000 而非负数,使用负数会越界