基于线性规划的图边着色问题的多项式时间算法求解示例
问题描述
边着色(Edge Coloring)是图论中的一个经典问题。给定一个无向简单图 G=(V, E),目标是用最少的颜色对图中所有的边进行着色,使得任意两条相邻的边(即共享一个公共顶点的边)被涂上不同的颜色。这个所需的最少颜色数称为图的边色数 χ‘(G)。对于一般图,确定边色数是NP难的。然而,对于二分图(Bipartite Graph),存在一个著名的定理(Kőnig’s line coloring theorem)指出,其边色数等于图中顶点的最大度数 Δ。本示例将展示如何利用线性规划模型及其对偶,结合二分图最大匹配算法,为二分图设计一个多项式时间算法,来求解一个使用恰好 Δ 种颜色的边着色方案。
解题过程
步骤1:建立整数线性规划模型
我们首先将问题建模为一个整数线性规划(ILP)问题。
- 决策变量: 对于每条边 e ∈ E 和每种颜色 c ∈ {1, 2, ..., Δ},定义一个二元变量 \(x_{e,c}\)。
\[ x_{e,c} = \begin{cases} 1, & \text{如果边 } e \text{ 被着色为颜色 } c \\ 0, & \text{否则} \end{cases} \]
- 目标函数: 我们的目标是使用最少的颜色,但由于定理保证了 Δ 种颜色足够,我们的目标就转化为寻找一个可行的 Δ-边着色。因此,我们可以将目标函数设为常数(例如,最小化0),或者更实际地,在后续算法中我们目标是构造着色,而非优化颜色数量。模型重点在于约束。
- 约束条件:
- 每条边必须被着一种颜色: 对于每条边 e ∈ E,
\[ \sum_{c=1}^{\Delta} x_{e,c} = 1 \]
2. **在同一个顶点处,每种颜色至多使用一次**(相邻边颜色不同): 对于每个顶点 v ∈ V 和每种颜色 c ∈ {1, ..., Δ},
\[ \sum_{e \in \delta(v)} x_{e,c} \le 1 \]
其中 δ(v) 表示与顶点 v 相关联的边集。
3. **二元约束**: 对于所有 e ∈ E, c ∈ {1, ..., Δ},
\[ x_{e,c} \in \{0, 1\} \]
这个ILP模型精确描述了二分图的边着色问题。但由于是整数规划,直接求解可能是指数时间的。关键在于,对于二分图,其线性规划松弛(即将 \(x_{e,c} \in \{0,1\}\) 松弛为 \(0 \le x_{e,c} \le 1\))总是存在整数最优解。我们将利用这一性质。
步骤2:线性规划松弛及其性质
我们将上述ILP松弛为线性规划(LP):
\[\begin{aligned} \text{约束:} \quad & \sum_{c=1}^{\Delta} x_{e,c} = 1, && \forall e \in E \\ & \sum_{e \in \delta(v)} x_{e,c} \le 1, && \forall v \in V, c = 1,\dots,\Delta \\ & 0 \le x_{e,c} \le 1, && \forall e \in E, c = 1,\dots,\Delta \end{aligned} \]
关键性质: 对于二分图,这个LP的约束矩阵是全单模的(Totally Unimodular)。这意味着,只要该LP的右端项是整数(此处全为1),那么LP的任何基本可行解(极点)都是整数解。因此,求解这个LP松弛,我们就能直接得到原ILP(即边着色问题)的一个整数最优解,而无需处理整数约束的复杂性。
步骤3:算法设计思路——基于对偶与匹配的构造性算法
虽然可以直接用通用LP求解器,但我们希望设计一个更高效、更具组合意义的专门算法。思路是利用LP的对偶理论,将其分解为一系列二分图匹配问题。
考虑上述LP的对偶问题:
- 对偶变量: 为每个“边赋值”约束引入变量 \(y_e\)(无符号限制),为每个“顶点-颜色”约束引入非负变量 \(z_{v,c} \ge 0\)。
- 对偶问题:
\[ \begin{aligned} \max \quad & \sum_{e \in E} y_e - \sum_{v \in V} \sum_{c=1}^{\Delta} z_{v,c} \\ \text{s.t.} \quad & y_e - \sum_{v \in e} z_{v,c} \le 0, && \forall e \in E, c = 1,\dots,\Delta \\ & z_{v,c} \ge 0, && \forall v \in V, c = 1,\dots,\Delta \end{aligned} \]
由互补松弛条件,如果原始解 $ x_{e,c} $ 和对偶解 $ (y_e, z_{v,c}) $ 都是最优的,那么:
1. 若 $ x_{e,c} > 0 $,则必有 $ y_e = \sum_{v \in e} z_{v,c} $。
2. 若 $ z_{v,c} > 0 $,则必有 $ \sum_{e \in \delta(v)} x_{e,c} = 1 $。
算法可以这样构造:我们尝试为每种颜色 c 分配边。对于一种固定的颜色 c,如果我们暂时忽略其他颜色,那么约束 \(\sum_{e \in \delta(v)} x_{e,c} \le 1\) 意味着着颜色 c 的边集必须构成图的一个匹配(Matching)。而约束 \(\sum_{c} x_{e,c} = 1\) 意味着每条边最终必须被分配到恰好一种颜色。
因此,一个自然的贪婪式迭代算法是:从颜色1到 Δ,依次为每种颜色寻找一个匹配,并将该匹配中的边着上当前颜色,然后从图中移除这些边。但问题是,如何保证在 Δ 轮后,所有边都能被覆盖(即匹配的并集等于 E)?
这就是Kőnig定理的构造性证明思路,它等价于寻找原LP的一个可行解。一个经典的算法是:
算法:二分图边着色的多项式时间算法
-
输入:一个二分图 G=(V, E),最大度数 Δ。
-
将颜色编号为 1, 2, ..., Δ。
-
For 颜色 c 从 1 到 Δ do:
a. 考虑当前图 G(初始为输入图)。由于是二分图,其最大度数至少为 c(因为我们在处理前 c 种颜色时,已移除的边数不会使剩余图的最大度数低于正在进行的颜色编号?不,更准确地说,我们需要一个归纳性质)。
b. 实际上,更稳定的算法描述如下(类似于“分层”或“多次匹配”算法):
* 令 H 是 G 的一个子图,其顶点最大度数恰好为 k(k ≤ Δ)。我们可以用 k 种颜色为 H 的边着色(这是算法要递归/迭代证明的核心)。
* 基础:对于一个最大度数为1的图(一组不相连的边),显然可以用1种颜色着色。
* 归纳步骤:假设我们能对任何最大度数为 k-1 的二分图进行边着色。现在面对一个最大度数为 k 的二分图 G。
* 由于二分图且最大度数为 k,根据霍尔定理的推广,G 中存在一个完美匹配(或至少一个最大匹配)M,覆盖了所有度数为 k 的顶点。这个匹配可以用颜色 k 来着色。
* 从 G 中移除匹配 M 得到图 G'。G' 的最大度数为 k-1。
* 根据归纳假设,我们可以用 k-1 种颜色为 G' 着色。
* 因此,G 可以用 k 种颜色着色(G' 的 k-1 种颜色,加上匹配 M 的颜色 k)。 -
实现关键:上述过程中,每一步“找到一个匹配覆盖所有最大度顶点”可以在二分图中用经典的最大匹配算法(如Hopcroft-Karp算法,时间复杂度 O(|E|√|V|))来实现。我们不断寻找这样的匹配并着色,直到所有边都被处理。
-
算法流程(精简版):
- 初始化剩余图 R = G,颜色集 C = {}。
- While R 中还有边:
- 在 R 中找到一个最大匹配 M(使用Hopcroft-Karp算法)。
- 将 M 中的所有边分配一种新的颜色。
- 从 R 中移除 M 中的所有边。
- 但这样简单的贪婪不能保证只用 Δ 种颜色。为了保证 Δ 种颜色,我们需要更系统的构造,如上述归纳法所描述的。一个等价的实现是“多次匹配法”:
- 创建一个颜色列表 color = 1 to Δ。
- For i = 1 to Δ:
a. 在当前图 G 中,找到所有未着色的边。
b. 构建一个子图 Gi,包含所有未着色边,并且我们试图为其寻找一个匹配,该匹配将使用颜色 i。但为了最终能用 Δ 种颜色完成,我们需要确保在每一轮,对于每个顶点,颜色 i 至多分配给一条与之关联的未着色边。这正是在 Gi 中寻找一个匹配。
c. 在 Gi 上运行二分图最大匹配算法,得到一个匹配 Mi。
d. 将匹配 Mi 中的所有边着上颜色 i。 - 由于二分图满足 Kőnig 定理,经过 Δ 轮后,所有边都会被着色,并且每个顶点关联的边中,每种颜色至多出现一次。
步骤4:复杂度分析
- 主循环运行 Δ 轮。
- 在每一轮中,需要在一个二分图(是原图的子图)上计算一次最大匹配。使用Hopcroft-Karp算法,时间复杂度为 O(|E|√|V|)。
- 因此,总的时间复杂度为 O(Δ * |E|√|V|)。由于 Δ ≤ |V|,最坏情况下为 O(|V| * |E|√|V|) = O(|E| * |V|^{1.5})。对于简单图,|E| ≤ |V|^2,所以最坏为 O(|V|^{3.5}),是多项式时间。
步骤5:示例演示
考虑一个简单的二分图:顶点集 V = {A, B, C, D},左边 L = {A, B},右边 R = {C, D}。边集 E = {(A,C), (A,D), (B,C), (B,D)}。这是一个完全二分图 K_{2,2},最大度数 Δ = 2。
- 颜色1: 寻找一个匹配。可以找到匹配 M1 = {(A,C), (B,D)}。将这两条边着颜色1。
- 颜色2: 剩余边为 {(A,D), (B,C)}。它们本身构成一个匹配 M2。将这两条边着颜色2。
- 结果: 我们得到了一个2-边着色,满足相邻边颜色不同。
总结
本示例展示了如何将二分图边着色问题建模为整数线性规划,并利用其线性规划松弛具有整数解的性质,将其转化为可在多项式时间内求解的问题。进而,我们设计了一个基于二分图最大匹配算法的构造性多项式时间算法,该算法本质上是原始-对偶思想与组合优化中Kőnig定理证明的体现,高效地构造出使用 Δ 种颜色的边着色方案。