xxx 最小平均权重环问题(Minimum Mean Weight Cycle Problem)
题目描述
给定一个有向图,图中每条边带有任意实数权重(可以是正、负、零),要求找出图中平均权重最小的环。
平均权重的定义是:环上所有边的权重之和除以环的边数(或顶点数)。
我们需要在所有环中,找到平均权重最小的那个,并输出其平均权重值。
为什么这个问题重要?
- 可以用来检测图中是否存在“很负”的平均权重环(比如在调度、电路分析中判断系统是否可改进)。
- 是求解“最小平均成本流”等问题的子步骤。
- 是经典的最短路径问题的一个变体,涉及权重和与边数的比值最小化。
解题思路
1. 问题形式化
设图 \(G = (V, E)\),边 \(e\) 有权重 \(w(e)\)。
对于一个环 \(C = (v_1, v_2, \dots, v_k, v_1)\),平均权重为:
\[\mu(C) = \frac{\sum_{i=1}^k w(v_i \to v_{i+1})}{k} \]
(下标 \(k+1\) 取 1,表示回到起点。)
目标:
\[\mu^* = \min_{C \text{ 是环}} \mu(C) \]
2. 关键观察
如果固定一个长度 \(L\),我们能否判断是否存在一个环,其平均权重 \(\le \lambda\)?
可以转换:对每条边权重减去 \(\lambda\),得到新权重:
\[w'(e) = w(e) - \lambda \]
原问题等价于:是否存在环,使得在新权重下总权重 \(\le 0\)。
因为:
\[\frac{\sum w(e)}{k} \le \lambda \iff \sum w'(e) \le 0 \]
于是,判断“平均权重是否 \(\le \lambda\)”可转化为判断新图中是否存在非正总权重的环,也就是是否存在负环(因为如果总权重为 0 也是允许的)。
3. 二分答案框架
- 我们不知道 \(\mu^*\) 的具体值,但可以猜测一个值 \(\lambda\),然后判断“是否存在平均权重 \(\le \lambda\) 的环”。
- 如果存在,说明 \(\mu^* \le \lambda\),否则 \(\mu^* > \lambda\)。
- 这样就能用二分法逼近 \(\mu^*\)。
4. 如何判断“是否存在平均权重 ≤ λ 的环”
构造新图,边权 \(w'(e) = w(e) - \lambda\)。
问题变成:新图中是否存在负环(总权重 ≤ 0 的环)。
检测负环可以用 Bellman-Ford 算法,但要注意:
因为我们要检测的是任意环,而 Bellman-Ford 只能从某个源点出发检测从该源点可达的负环。
但原图可能不连通,所以需要添加一个超级源点,连接到所有顶点,边权为 0,然后在新图上跑 Bellman-Ford 检测负环。
更简单的办法:用 Karp 在 1978 年提出的基于最短路径长度公式的方法,可以避免二分,直接算出来。
5. Karp 的最小平均权重环算法(不用二分)
定义:
\[F_k(v) = \text{从任意起点到 } v \text{ 恰好经过 } k \text{ 条边的最短路径长度} \]
注意这里“从任意起点”实际算法中是枚举所有起点的效果,但 Karp 用了一个巧妙的 DP 计算。
具体递推:
- 初始化 \(F_0(v) = 0\) 对全部 \(v\)。
- 对 \(k = 1\) 到 \(n\)(n 是顶点数):
\[ F_k(v) = \min_{(u, v) \in E} \left\{ F_{k-1}(u) + w(u, v) \right\} \]
计算完后,对于每个顶点 \(v\),考虑从任意起点到 \(v\) 的路径,然后从 \(v\) 回到自身形成环。但路径长度可能不同,Karp 证明:
\[\mu^* = \min_{v \in V} \max_{0 \le k \le n-1} \frac{F_n(v) - F_k(v)}{n - k} \]
解释:
\(F_n(v)\) 是某个起点到 \(v\) 经过 \(n\) 条边的路径最小总权重,\(F_k(v)\) 是到 \(v\) 经过 \(k\) 条边的路径最小总权重,它们的差相当于从第 \(k\) 条边到第 \(n\) 条边这段形成了一个环(因为经过了 \(n-k\) 条边,并且两次到达同一个顶点 \(v\),所以中间必有环),这个平均权重就是差值除以 \(n-k\)。我们取所有 \(v\) 和 \(k\) 的最小值。
6. 算法步骤
- 输入有向图 \(G=(V, E)\),边权 \(w(e)\),顶点数 \(n\)。
- 初始化 \(F_0(v) = 0\) 对所有 \(v\)。
- 对 \(k = 1\) 到 \(n\):
- 对每个顶点 \(v\):
- 令 \(F_k(v) = \infty\) 初始化
- 对每条入边 \((u, v)\):
- 对每个顶点 \(v\):
\[ F_k(v) = \min(F_k(v), F_{k-1}(u) + w(u, v)) \]
- 计算最小平均权重:
\[ \mu^* = \infty \]
对每个顶点 \(v\):
\[ \text{如果 } F_n(v) \text{ 是无穷大,跳过} \]
否则:
\[ \text{max\_ratio} = -\infty \]
对 \(k = 0\) 到 \(n-1\):
- 如果 \(F_k(v)\) 是无穷大,跳过
- 否则:
\[ \text{max\_ratio} = \max(\text{max\_ratio}, \frac{F_n(v) - F_k(v)}{n - k}) \]
更新:
\[ \mu^* = \min(\mu^*, \text{max\_ratio}) \]
- 输出 \(\mu^*\)。
7. 为什么这个公式有效
- 任何环最多有 \(n\) 个顶点,但路径经过 \(n\) 条边意味着必然重复了顶点,从而在某个顶点 \(v\) 处,路径可以拆成“前 \(k\) 条边到达 \(v\)”和“后 \(n-k\) 条边也到达 \(v\)”,后一段就是一个环。
- 取最大值是为了考虑“最差的一段”,但我们要最小化这个“最差一段”的平均权重,所以外层对 \(v\) 取最小值。
8. 时间复杂度
- 递推 \(F_k(v)\) 需要 \(O(n \cdot m)\) 时间(\(m\) 是边数)。
- 计算比值需要 \(O(n^2)\)。
- 总复杂度 \(O(nm)\),适合中等规模图。
9. 举例说明
考虑下图(4 个顶点,有向边):
边:
- 0→1: 1
- 1→2: 2
- 2→3: 3
- 3→0: -6
- 0→2: 4
- 1→3: 5
手工计算:
环 0→1→2→3→0 总权重 1+2+3+(-6)=0,平均 0。
环 0→2→3→0 总权重 4+3+(-6)=1,平均 1/3。
显然最小平均是 0。
我们用 Karp 方法(简略):
n=4,计算 F_k(v) 表格(略过程),最后算比值得到最小平均 0。
总结
- 最小平均权重环问题可用 Karp 的 \(O(nm)\) 算法直接解,无需二分。
- 核心是 DP 计算 \(F_k(v)\) 然后利用公式:
\[ \mu^* = \min_v \max_{0\le k \le n-1} \frac{F_n(v) - F_k(v)}{n-k} \]
- 这个算法在有负权、零权、正权时都有效,并能准确求出最小平均权重值。