最小平均权重环问题(Minimum Mean Weight Cycle Problem)
问题描述
给定一个有向图(可能存在负权边,但不能存在权值总和为负的环路,否则最小平均值会趋向负无穷,问题无解),图中每条边都有一个实数的权重(可正、可负、可零)。
我们需要找出图中所有环路中,平均权重最小的那一个环路的平均权重值。
形式化定义:对于一个环路 \(C = (v_0, v_1, \dots, v_{k-1}, v_0)\),其总权重为
\[w(C) = \sum_{i=0}^{k-1} w(v_i, v_{(i+1) \bmod k}) \]
环的长度(边数)为 \(|C| = k\),则其平均权重为
\[\mu(C) = \frac{w(C)}{|C|} \]
问题的目标是计算
\[\mu^* = \min_{C \text{ 是环路}} \mu(C) \]
背景与难点
- 如果图中存在负权环(总权重为负),则平均权重可以为负数,但若存在负权环,其平均权重可能很小,但不会无限制地小,因为这里我们要求是“最小平均权重”,而不是“最小总权重”。
- 不过,如果存在总权重为负的环,则最小平均权重可能为负数,我们需要找到那个平均值最小的环。
- 直接枚举所有环路是不可能的,因为环路数量可能指数级增长。
- 该问题在调度、电路设计、网络流中有应用。
核心思路
1. 转化为判定问题
假设我们猜测一个平均值 \(\mu\),想判断“是否存在一个环路 \(C\) 使得 \(\mu(C) < \mu\)”。
对图中每条边的权重进行变换:
\[w'(u,v) = w(u,v) - \mu \]
那么
\[w'(C) = w(C) - |C| \mu \]
因此
\[\frac{w(C)}{|C|} < \mu \iff w'(C) < 0 \]
也就是说,原图中平均权重小于 \(\mu\) 的环路 等价于 新图中存在总权重为负的环路。
于是,原问题转化为:
找到最小的 \(\mu\),使得在权重 \(w - \mu\) 的图中不存在负权环。
2. 利用二分查找
由于平均权重的最小值一定在某个环路上取得,并且这个平均值必然在边的最小权重和最大权重之间,我们可以二分查找 \(\mu\)。
设边权最小值为 \(L\),最大值为 \(R\)。
二分查找精度达到足够小(比如 \(10^{-8}\))时停止。
每次猜测 \(\mu = (L+R)/2\),建新图 \(w' = w - \mu\),用 Bellman-Ford 算法 判断新图中是否存在负权环:
- 如果存在负权环,说明原图中有平均权重小于 \(\mu\) 的环,那么 \(\mu\) 太大,调整 \(R = \mu\)
- 如果不存在负权环,说明原图中所有环的平均权重大于等于 \(\mu\),那么 \(\mu\) 太小,调整 \(L = \mu\)
复杂度:Bellman-Ford 一次 O(VE),二分查找 O(log((R-L)/eps)),总复杂度 O(VE log((R-L)/eps))。
3. 更优算法:Karp 的最小平均权重环算法
Karp 在 1978 年提出一个 O(VE) 的精确算法,不需要二分查找。下面详细讲解。
Karp 算法步骤
设图有 n 个顶点(编号 0 到 n-1),m 条边。
定义:
令 \(F_k(v)\) 表示从任意起点(不固定)到顶点 v,经过恰好 k 条边的最短路径长度。
如果从起点到 v 没有恰好 k 条边的路径,则 \(F_k(v) = \infty\)。
初始化:
- \(F_0(0) = 0\),且对于 \(v \neq 0\),\(F_0(v) = \infty\)。
- 但 Karp 的原始定义是:\(F_0(v) = 0\) 当 \(v = s\),但为了算法正确,我们需要对所有可能的起点做 n 次? 不,Karp 算法巧妙之处是:设一个虚拟起点 s,从 s 到所有顶点有一条权重为 0 的边,然后计算从 s 出发的最短路径。但更简单的理解是:
更简单的理解:
我们定义 \(F_k(v)\) 为:从任意结点出发,经过恰好 k 条边到达 v 的最小总权重。
初始化:
\(F_0(v) = 0\) 对所有 v 成立(因为 0 条边,只能从 v 到 v,权重 0)。
然后递推:
\[F_k(v) = \min_{(u,v) \in E} \left[ F_{k-1}(u) + w(u,v) \right] \]
其中 \(k = 1, 2, \dots, n\)。
注意:这里允许重复经过点和边,因为我们要找环,可能路径会重复。
递推计算:
对 k = 1 到 n:
对每个 v,用所有入边 (u,v) 更新:
\[F_k(v) = \min_{(u,v) \in E} \{ F_{k-1}(u) + w(u,v) \} \]
复杂度 O(VE) 可以计算完 \(F_0\) 到 \(F_n\)。
关键定理(Karp 1978):
最小平均权重 \(\mu^*\) 等于
\[\mu^* = \min_{v \in V} \max_{0 \le k \le n-1} \frac{F_n(v) - F_k(v)}{n - k} \]
其中 \(F_n(v)\) 必须是有穷的(即存在长度为 n 的路径到 v)。
理解:
- \(F_n(v)\) 表示从某起点(任意)到 v 的恰好 n 条边的最短路径。
- 这个路径必然包含环(因为 n 条边至少访问 n+1 个点,但只有 n 个点,必有点重复),可以分解为:一条到某点 u 的长度为 k 的路径 + 一个长度 n-k 的环路(从 u 出发又回到 u 的环)。
- 那么环的平均权重是 \(\frac{F_n(v) - F_k(u)}{n-k}\),但 u 是路径上的点,不一定直接是 v,不过在公式中取 min over v 和 max over k 能保证捕获到最小平均权重的环。
算法步骤总结
- 输入有向图 G=(V,E) 和边权 w(u,v),V=n 个点,E=m 条边。
- 初始化 \(F[0][v] = 0\) 对 v=0..n-1。
- 对 t=1 到 n:
- 对每个 v,计算
\(F[t][v] = \min_{(u,v) \in E} (F[t-1][u] + w(u,v))\)
如果没有任何入边可更新,则 \(F[t][v] = \infty\)。
- 对每个 v,计算
- 如果存在 v 使得 \(F[n][v] = \infty\),则该 v 不参与最终计算。
- 对每个 v,计算
\[ \mu(v) = \max_{0 \le k \le n-1} \frac{F[n][v] - F[k][v]}{n-k} \]
其中分母 n-k 必须大于 0,且 \(F[n][v]\) 和 \(F[k][v]\) 都必须有限。
6. 最终 \(\mu^* = \min_{v \in V} \mu(v)\)。
例子说明
考虑有向图 4 个点,边如下:
0→1: 1
1→2: 1
2→3: 1
3→0: 1
0→2: 4
1→3: 4
这是一个有向图,环 0→1→2→3→0 总权重 4,长度 4,平均 1。
环 0→2→3→0 总权重 1+1+1=3? 检查:0→2:4, 2→3:1, 3→0:1,总权重 6,长度 3,平均 2。
环 0→1→3→0 总权重 1+4+1=6,长度 3,平均 2。
显然最小平均权重是 1。
我们用 Karp 算法计算:
n=4。
初始化 F[0][v]=0。
t=1:
F[1][0] = min(F[0][3]+w(3,0))=0+1=1
F[1][1] = F[0][0]+1=1
F[1][2] = min(F[0][0]+4=4, F[0][1]+1=1) → 1
F[1][3] = min(F[0][1]+4=4, F[0][2]+1=1) → 1
t=2:
F[2][0] = F[1][3]+1=1+1=2
F[2][1] = F[1][0]+1=1+1=2
F[2][2] = min(F[1][0]+4=5, F[1][1]+1=2) → 2
F[2][3] = min(F[1][1]+4=5, F[1][2]+1=2) → 2
t=3:
F[3][0] = F[2][3]+1=3
F[3][1] = F[2][0]+1=3
F[3][2] = min(F[2][0]+4=6, F[2][1]+1=3) → 3
F[3][3] = min(F[2][1]+4=6, F[2][2]+1=3) → 3
t=4:
F[4][0] = F[3][3]+1=4
F[4][1] = F[3][0]+1=4
F[4][2] = min(F[3][0]+4=7, F[3][1]+1=4) → 4
F[4][3] = min(F[3][1]+4=7, F[3][2]+1=4) → 4
现在计算 μ(v) = max_{k=0..3} (F[4][v]-F[k][v])/(4-k)
v=0:
k=0: (4-0)/4=1
k=1: (4-1)/3=1
k=2: (4-2)/2=1
k=3: (4-3)/1=1
μ(0)=1
v=1: 类似全 1。
v=2: 类似全 1。
v=3: 类似全 1。
所以 μ*=1,符合预期。
复杂度
- 计算 F[t][v] 需要 O(n * m) 时间。
- 第二步对每个 v 比较 n 个比值,O(n²)。
- 总复杂度 O(nm),适合稠密图也很好。
算法正确性理解
直观理解:F[n][v] 表示从某起点到 v 的 n 条边的最短路径,因为 n 条边至少访问 n+1 个顶点,必有环。这个环可以被“分离”出来,而剩下的是一条路径。通过枚举最后一个顶点 v 和环开始前的步数 k,我们考虑环的长度 n-k,其平均权重是 (F[n][v] - F[k][v])/(n-k)。取 max 再取 min 是为了应对可能的最坏分解,从而得到真正的最小平均权重。
应用场景
- 检测图中是否有负平均权重环(比如在某些调度问题中表示不可行)。
- 在离散事件系统中用于计算最大周期平均值。
- 是求解最小平均权重环的标准算法。
总结
最小平均权重环问题可以通过 Karp 的 O(VE) 动态规划算法高效求解,避免了二分查找的精度问题和额外对数因子。算法思想是计算从任意起点到每个点恰好 k 条边的最短路径,然后通过公式直接得出最小平均值。