基于线性规划的“有向无环图(DAG)最小路径覆盖”问题的多项式时间求解算法
题目描述
考虑一个有向无环图(Directed Acyclic Graph, DAG)\(G = (V, E)\),其中 \(|V| = n\),\(|E| = m\)。一条“路径覆盖”是指一组顶点不相交的有向路径,使得图中每个顶点恰好出现在一条路径中。目标是找到包含路径数量最少的一个路径覆盖,即“最小路径覆盖”。
例如,在任务依赖图中,每个顶点代表一个任务,有向边表示依赖关系,最小路径覆盖对应将任务划分成最少的不冲突的执行序列(每条路径是一个顺序执行的任务链)。本问题要求基于线性规划与图论模型,设计一个多项式时间算法来求解最小路径覆盖。
解题过程
步骤1:问题转化与建模
直接求解最小路径覆盖较为困难,但可通过经典的“拆点法”转化为二分图最大匹配问题:
- 将每个顶点 \(v \in V\) 拆分为两个顶点:左部顶点 \(v_{\text{out}}\) 表示路径的起点或中间点的“出发”角色,右部顶点 \(v_{\text{in}}\) 表示路径的终点或中间点的“到达”角色。
- 构建二分图 \(B = (U, W, E')\):
- \(U = \{ v_{\text{out}} \mid v \in V \}\),
- \(W = \{ v_{\text{in}} \mid v \in V \}\),
- 对于原图的有向边 \((u, v) \in E\),在二分图中添加边 \((u_{\text{out}}, v_{\text{in}})\)。
- 关键结论:DAG的最小路径覆盖数 = \(n - \text{最大匹配数}\)。
这是因为每个匹配 \((u_{\text{out}}, v_{\text{in}})\) 表示在原图中将 \(u\) 和 \(v\) 连接在一条路径上,每个未匹配的左部顶点对应一条路径的起点,未匹配的右部顶点对应一条路径的终点,且起点与终点数量相等,故路径数 = 起点数 = \(n - \text{匹配数}\)。
步骤2:线性规划模型构建
二分图最大匹配可写为整数线性规划(ILP),其松弛后的线性规划(LP)如下:
变量:对每条边 \((u_{\text{out}}, v_{\text{in}}) \in E'\),定义 \(x_{uv} \in [0, 1]\) 表示是否选择该匹配边。
目标:最大化匹配边数
\[\max \sum_{(u_{\text{out}}, v_{\text{in}}) \in E'} x_{uv} \]
约束:每个顶点最多与一条匹配边关联(因为路径不相交)
\[\begin{aligned} \sum_{v: (u_{\text{out}}, v_{\text{in}}) \in E'} x_{uv} &\le 1, \quad \forall u \in U \quad \text{(每个左顶点最多匹配一次)} \\ \sum_{u: (u_{\text{out}}, v_{\text{in}}) \in E'} x_{uv} &\le 1, \quad \forall v \in W \quad \text{(每个右顶点最多匹配一次)} \\ x_{uv} &\ge 0, \quad \forall (u_{\text{out}}, v_{\text{in}}) \in E' \end{aligned} \]
注意:此LP的系数矩阵是全幺模矩阵(因为二分图的关联矩阵是全幺模的),因此LP的最优解自动为整数解(0或1),无需整数约束。这使得我们可直接用多项式时间线性规划算法(如内点法)求解,但通常用更高效的特殊算法。
步骤3:多项式时间算法设计
虽然可直接解LP,但利用二分图特性有更优方法:
- 转换为最大流问题:在二分图 \(B\) 上添加源点 \(s\) 和汇点 \(t\),从 \(s\) 到每个 \(u \in U\) 连容量1的边,从每个 \(v \in W\) 到 \(t\) 连容量1的边,原边 \((u_{\text{out}}, v_{\text{in}})\) 容量为1。该网络的最大流值即为最大匹配数。
- 使用Dinic算法求解:因为所有容量为整数且为1,Dinic算法的时间复杂度为 \(O(\sqrt{n} \cdot m)\)(在单位容量网络中),其中 \(n\) 和 \(m\) 是原DAG的顶点数和边数。这是多项式时间。
步骤4:从匹配构造路径覆盖
设求得的最大匹配为 \(M \subseteq E'\)。
- 初始化:每个顶点 \(v \in V\) 自成一个单点路径。
- 对每条匹配边 \((u_{\text{out}}, v_{\text{in}}) \in M\),将 \(u\) 所在的路径与 \(v\) 所在的路径合并(因为 \(u\) 的后继是 \(v\))。由于DAG无环,合并不会形成环。
- 合并后得到一组顶点不相交的有向路径,覆盖所有顶点,且路径数 = \(n - |M|\)。
步骤5:算法复杂度与最优性证明
- 时间复杂度:主要由最大流算法决定,若用Dinic算法,为 \(O(\sqrt{n} \cdot m)\)。
- 最优性证明:
(1)任何路径覆盖对应一个匹配:对覆盖中每条路径上相邻的顶点对 \((u, v)\),取匹配边 \((u_{\text{out}}, v_{\text{in}})\),易见匹配数 = \(n - \text{路径数}\)。
(2)反之,任何匹配对应一个路径覆盖(通过步骤4的构造),路径数 = \(n - \text{匹配数}\)。
(3)因此最大化匹配数等价于最小化路径数。LP的解是全幺模矩阵的顶点解,即为整数最大匹配,故算法得到最优路径覆盖。
步骤6:示例演示
考虑DAG:顶点集 \(V = \{1, 2, 3, 4\}\),边 \(E = \{(1,2), (1,3), (2,4), (3,4)\}\)。
- 拆点:左部 \(U = \{1_o, 2_o, 3_o, 4_o\}\),右部 \(W = \{1_i, 2_i, 3_i, 4_i\}\)。
- 二分图边:\((1_o,2_i), (1_o,3_i), (2_o,4_i), (3_o,4_i)\)。
- 最大匹配:例如 \(M = \{(1_o,2_i), (3_o,4_i)\}\),大小=2。
- 最小路径覆盖:路径数 = \(4 - 2 = 2\)。构造:从匹配得路径 \(1 \to 2\) 和 \(3 \to 4\),覆盖所有顶点。
总结
本问题通过拆点转化为二分图最大匹配,利用其全幺模性质可用线性规划求解,并基于最大流算法得到多项式时间最优解。这是图论与线性规划结合解决组合优化问题的经典案例。