图论中的最小直径生成树问题
题目描述
给定一个连通无向图 \(G = (V, E)\),每条边有非负权重。要求找到一棵生成树,使得其直径(生成树中任意两点间最短路径的最大值)尽可能小。
解题思路
最小直径生成树(Minimum Diameter Spanning Tree, MDST)问题的核心是绝对中心(Absolute Center)理论:
- 图的绝对中心是图上一个点(可能在边上),使得所有顶点到它的最短距离的最大值(偏心率)最小。
- 最小直径生成树的直径等于绝对中心的偏心率的两倍。
步骤分解
步骤 1:计算所有点对最短路径
使用 Floyd-Warshall 算法或 \(n\) 次 Dijkstra 算法,得到距离矩阵 \(d(u, v)\)。
步骤 2:寻找绝对中心
绝对中心可能位于顶点或边上。对每条边 \(e = (u, v)\) 权重 \(w(u, v)\),考虑边上的点 \(x\),其到 \(u\) 的距离为 \(t\)(\(0 \leq t \leq w(u, v)\))。
- 顶点 \(z\) 到 \(x\) 的距离为:
\[ \text{dist}(z, x) = \min(d(z, u) + t, d(z, v) + w(u, v) - t) \]
- 定义函数 \(f_e(t) = \max_{z \in V} \text{dist}(z, x)\),即所有顶点到 \(x\) 的距离的最大值(偏心率)。
- 目标是在边上找到 \(t\) 使 \(f_e(t)\) 最小。
步骤 3:转化为分段线性函数的最小值
对每条边 \(e\),\(f_e(t)\) 是若干分段线性函数的上包络线(每个顶点对应一个 V 形函数)。
- 上包络线的最小值出现在某个交点或端点处。
- 具体方法:对每个顶点 \(z\),定义函数:
\[ g_z(t) = \min(d(z, u) + t, d(z, v) + w(u, v) - t) \]
其交点为 \(t_z = \frac{d(z, v) - d(z, u) + w(u, v)}{2}\)。
- 收集所有交点及端点 \(t = 0, t = w(u, v)\),计算每个候选 \(t\) 对应的 \(f_e(t)\),取最小值。
步骤 4:确定绝对中心及半径
对所有边执行步骤 3,得到全局最小的偏心率 \(R\)(即绝对中心的偏心率)。最小直径生成树的直径为 \(2R\)。
步骤 5:构造最小直径生成树
以绝对中心 \(x^*\) 为根,使用最短路径树(Shortest Path Tree)算法:
- 若 \(x^*\) 在边 \((u, v)\) 上,则添加虚拟顶点 \(x^*\),边 \((u, x^*)\) 和 \((v, x^*)\) 权重为 \(t\) 和 \(w(u, v) - t\)。
- 从 \(x^*\) 运行 Dijkstra 算法,得到最短路径树。
- 移除虚拟顶点,将树还原为原图的生成树。
举例说明
考虑图:顶点集 \(\{A, B, C\}\),边 \((A, B)=2, (B, C)=1, (A, C)=3\)。
- 计算距离矩阵:
\[ d = \begin{bmatrix} 0 & 2 & 3 \\ 2 & 0 & 1 \\ 3 & 1 & 0 \end{bmatrix} \]
- 检查边 \((A, B)\):
- 交点计算:对顶点 \(C\),
\[ t_C = \frac{d(C, B) - d(C, A) + w(A, B)}{2} = \frac{1 - 3 + 2}{2} = 0 \]
- 端点 \(t=0\) 时,偏心率 \(f_{AB}(0) = \max(0, 2, 3) = 3\)。
- 端点 \(t=2\) 时,偏心率 \(f_{AB}(2) = \max(2, 0, 3) = 3\)。
- 检查边 \((B, C)\):
- 对顶点 \(A\),
\[ t_A = \frac{d(A, C) - d(A, B) + w(B, C)}{2} = \frac{3 - 2 + 1}{2} = 1 \]
- 在 \(t=1\) 时,距离:
\(A\) 到中心:\(\min(2+1, 3+0) = 3\)
\(B\) 到中心:\(\min(0+1, 1+0) = 1\)
\(C\) 到中心:\(\min(1+1, 0+0) = 0\)
偏心率 \(\max(3,1,0)=3\)。
- 检查边 \((A, C)\)(略)。最终最小偏心率 \(R=1.5\)(示例中需详细计算所有边),直径 \(3\)。
关键点
- 绝对中心可能在边上,需枚举所有边。
- 偏心率最小化等价于直径最小化。
- 构造树时以绝对中心为根的最短路径树即为一棵最小直径生成树。