基于线性规划的图最小生成树问题的对偶算法求解示例
字数 6275 2025-12-08 12:36:43

基于线性规划的图最小生成树问题的对偶算法求解示例

题目描述

给定一个无向连通图 \(G = (V, E)\),其中 \(V\) 是顶点集,\(|V| = n\)\(E\) 是边集,\(|E| = m\)。每条边 \(e \in E\) 有一个非负的权重(或代价)\(c_e \geq 0\)。我们需要找到图 \(G\) 的一棵生成树(即一个包含所有顶点、无环的连通子图),使得其所有边的总权重最小。这是一个经典的最小生成树问题。

传统的算法如Kruskal或Prim算法能在多项式时间内直接解决此问题。然而,本题目要求我们基于线性规划理论,通过对偶方法来求解。具体来说,我们将:

  1. 构建最小生成树问题的线性规划模型。
  2. 写出其对偶线性规划。
  3. 解释对偶规划的经济/组合意义。
  4. 展示如何通过求解对偶规划,并结合互补松弛条件,来得到原问题(最小生成树)的最优解。

解题过程循序渐进讲解

步骤1:构建最小生成树问题的线性规划模型

我们需要为生成树中的边 \(e\) 引入决策变量 \(x_e \in \{0, 1\}\):如果边 \(e\) 在生成树中,则 \(x_e = 1\),否则为 0。目标是总权重最小。

一个连通无向图成为生成树需要满足两个条件:

  1. 它恰好包含 \(n-1\) 条边。
  2. 它不包含任何环。

条件1很容易表达为线性等式。条件2(无环)则复杂得多。对于一个包含 \(k\) 个顶点的集合 \(S \subseteq V\),其诱导子图中最多只能有 \(k-1\) 条边,否则会形成环。因此,无环条件可以等价地表达为:对于任意非空顶点子集 \(S \subset V\)(即 \(S \neq \varnothing\)\(S \neq V\)),其内部连接的边数不超过 \(|S|-1\)。这个约束称为子图消除约束

因此,最小生成树问题的整数线性规划模型如下:

原问题(P - 整数规划)
最小化:

\[ \sum_{e \in E} c_e x_e \]

满足:

\[ \sum_{e \in E} x_e = n-1 \quad \quad \text{(边数约束)} \]

\[ \sum_{e \in E(S)} x_e \leq |S| - 1, \quad \forall S \subset V, S \neq \varnothing, S \neq V \quad \text{(子图消除约束)} \]

\[ x_e \in \{0, 1\}, \quad \forall e \in E \]

其中 \(E(S)\) 表示两个端点都在集合 \(S\) 内部的边的集合。

线性规划松弛:将整数约束 \(x_e \in \{0,1\}\) 松弛为 \(0 \leq x_e \leq 1\),得到一个线性规划。可以证明,这个线性规划的最优解中,每个 \(x_e\) 自动是整数(0或1),因此松弛是紧的。这个结论源于图的多面体理论。所以我们直接求解其线性规划松弛即可。

步骤2:写出对偶线性规划

为了得到对偶,我们将原问题(P)的线性规划松弛重写为标准形式。

原问题的变量是 \(x_e\)。约束包括:

  1. 一个等式约束:\(\sum_{e} x_e = n-1\)
  2. 无数个不等式约束(对每个非空真子集 \(S\)):\(\sum_{e \in E(S)} x_e \leq |S|-1\)
  3. 变量上界约束 \(x_e \leq 1\)(因为 \(x_e \geq 0\) 已在标准形式中隐含,但这里 \(x_e \leq 1\) 是从 \(x_e \leq 1\) 的自然上界得来,但在原始模型中未显式写出。实际上,在子图消除约束中,当 \(S = \{i, j\}\) 时,意味着对每条边 \(e = (i, j)\),有 \(x_e \leq 1\),所以不需要单独的上界约束)。

引入对偶变量:

  • 对等式约束 \(\sum_{e} x_e = n-1\),引入一个自由变量 \(y_0\)(可以视为与“树”相关的全局变量)。
  • 对每个子图消除约束(对应子集 \(S\)),引入一个非负变量 \(y_S \geq 0\)

则对偶线性规划为:

对偶问题(D)
最大化:

\[ (n-1) y_0 - \sum_{S \subset V, S \neq \varnothing, S \neq V} (|S|-1) y_S \]

满足:
对于每条边 \(e = (i, j) \in E\)

\[ y_0 - \sum_{S: e \in E(S)} y_S \leq c_e \]

其中,当 \(e = (i,j)\) 时,对偶约束的左边对所有包含顶点 \(i\)\(j\) 的子集 \(S\) 进行求和(即 \(i \in S\)\(j \in S\))。
同时,\(y_S \geq 0\) 对于所有 \(S\),且 \(y_0\) 自由。

步骤3:简化对偶模型并解释其意义

上面的对偶模型有指数多个变量(\(2^n - 2\)\(y_S\))。但我们可以赋予其直观的经济意义。

对偶问题的解释(“收益共享”或“预算分配”)

  • 想象有一个“中心”管理者,他想让图连通。每条边有一个建设成本 \(c_e\)
  • 对偶变量 \(y_S\) 可以解释为:集合 \(S\) 中的顶点愿意共同支付一笔预算 \(y_S\),来避免在其内部形成“圈”(即避免在 \(S\) 内部有过多的边)。
  • 全局变量 \(y_0\) 可以解释为整个树的价值(或每个顶点愿意为“连接”支付的单位费用)。
  • 对偶目标:最大化 \((n-1) y_0 - \sum_S (|S|-1) y_S\):这可以理解为“总连接收益减去避免形成圈的成本”的净收益。
  • 对偶约束:对于每条边 \(e = (i, j)\),条件 \(y_0 - \sum_{S: i, j \in S} y_S \leq c_e\) 意味着:如果要建设边 \(e\),其“有效收益”(总连接收益 \(y_0\) 减去所有包含 \(i, j\) 的集合 \(S\) 的避免圈成本之和)不能超过其实际建设成本 \(c_e\)。否则,建这条边就不划算。

步骤4:利用互补松弛条件构建算法

互补松弛条件连接了原问题最优解 \(x^*\) 和对偶问题最优解 \((y_0^*, \{y_S^*\})\)

  1. 原始互补松弛条件

    • 如果 \(x_e^* > 0\)(即边 \(e\) 在生成树中),则对应的对偶约束必须是紧的:\(y_0^* - \sum_{S: e \in E(S)} y_S^* = c_e\)
    • 如果对偶约束是松的(严格不等式),则 \(x_e^* = 0\)
  2. 对偶互补松弛条件

    • 如果 \(y_S^* > 0\),则对应的原始约束(子图消除约束)是紧的:\(\sum_{e \in E(S)} x_e^* = |S| - 1\)
    • 如果原始约束是松的(严格不等式),则 \(y_S^* = 0\)

对偶算法的核心思想
我们可以通过设置对偶变量,使得某些对偶约束变紧,从而“允许”一些边以零缩减成本进入生成树候选集,然后逐渐调整对偶变量,直到找到满足互补松弛条件的一组解。

这实际上是Kruskal算法Prim算法的对偶视角。例如,在Kruskal算法中,我们按边权从小到大排序,依次加入不形成圈的边。这个过程等价于以下对偶过程:

  • 初始化所有 \(y_S = 0\)
  • \(y_0\) 为某个值 \(t\)
  • 随着 \(t\) 从0逐渐增加,对于每条边 \(e\),其“有效成本” \(c_e' = c_e - y_0 + \sum_{S: e \in E(S)} y_S\) 会变化。当 \(c_e'\) 降为0时,这条边成为候选边。
  • 当我们加入一条边时,如果它连接了两个连通分量(即一个森林中的两棵树),则相当于合并了两个集合。这可以解释为:我们设置某个 \(y_S > 0\) 来“支付”以避免在某个集合内部形成多余的边,从而使得该边的有效成本降至0。

步骤5:一个具体的示例

考虑一个简单图:顶点集 \(V = \{1,2,3\}\),边 \(e_{12}\) 权重 5, \(e_{13}\) 权重 3, \(e_{23}\) 权重 4。

目标:用对偶方法找到最小生成树。

  1. 构建对偶模型
    对偶变量: \(y_0\)(自由), \(y_{\{1,2\}} \geq 0\)\(y_{\{1,3\}} \geq 0\)\(y_{\{2,3\}} \geq 0\)。(对于3个顶点的图,非平凡真子集就是每个2顶点集)
    对偶约束:

    • 边(1,2): \( y_0 - y_{\{1,2\}} \leq 5\)
    • 边(1,3): \( y_0 - y_{\{1,3\}} \leq 3\)
    • 边(2,3): \( y_0 - y_{\{2,3\}} \leq 4\)
      目标:最大化 \( (n-1) y_0 - \sum_S (|S|-1) y_S = 2 y_0 - (y_{\{1,2\}} + y_{\{1,3\}} + y_{\{2,3\}})\)
  2. 用“增大 \(y_0\)”的思想求解
    初始所有 \(y_S = 0\)。我们增大 \(y_0\),直到某条边的对偶约束变紧(等号成立)。
    \(y_0 = 3\) 时,边(1,3)的约束变紧:\(3 - 0 = 3 = c_{13}\)。此时边(1,3)的有效成本为0,我们可考虑将其加入生成树。
    加入边(1,3)后,顶点{1,3}连通。为了避免在集合{1,3}中再添加多余边(否则会形成环),我们“激活”对应的对偶变量 \(y_{\{1,3\}}\)
    允许 \(y_{\{1,3\}}\) 增加,同时保持边(1,3)的约束紧: \(y_0 - y_{\{1,3\}} = 3\)
    现在,为了继续扩大连通部分,我们继续增大 \(y_0\)
    随着 \(y_0\) 增大,边(1,2)和(2,3)的有效成本 \(c_e' = c_e - y_0 + y_S\) 在变化。注意,对于边(2,3),其端点在当前连通分量之外,所以尚未有 \(y_S\) 起作用(即 \(y_{\{2,3\}}\) 仍为0,因为{2,3}不在同一个已连通集合中)。
    我们需要计算下一个变紧的边。
    \(y_0 = t\),由 \(y_0 - y_{\{1,3\}} = 3\)\(y_{\{1,3\}} = t - 3\)
    检查边(1,2):约束为 \(t - y_{\{1,2\}} \leq 5\),目前 \(y_{\{1,2\}} = 0\),所以当 \(t = 5\) 时变紧。
    边(2,3):约束为 \(t - y_{\{2,3\}} \leq 4\),目前 \(y_{\{2,3\}} = 0\),当 \(t = 4\) 时变紧。
    所以下一个变紧的是边(2,3),在 \(t = 4\) 时。加入边(2,3)。现在连通了顶点{2,3},但与{1,3}是分开的两个连通分量。
    将{2,3}合并为一个连通分量,激活 \(y_{\{2,3\}}\),并保持其约束紧: \(y_0 - y_{\{2,3\}} = 4\),所以 \(y_{\{2,3\}} = t - 4\)
    现在有两个连通分量:{1,3} 和 {2}(实际上{2,3}已连通,但注意边(1,3)连接了1和3,边(2,3)连接了2和3,所以实际上三个顶点已通过边(1,3)和(2,3)连通了!)。
    检查边(1,2):其两个端点分别在集合{1,3}和{2,3}中,但这两个集合的交集是顶点3,所以实际上边(1,2)连接了两个已连通的集合吗?让我们看当前连通状态:顶点1、3通过边(1,3)连通;顶点2、3通过边(2,3)连通。因此,顶点1、2、3已全部连通,且我们已经有了2条边,恰好是 \(n-1 = 2\) 条边,所以已经形成了一棵生成树:边集为{(1,3), (2,3)},总权重 = 3+4 = 7。

  3. 验证互补松弛

    • 原始解: \(x_{13}^* = 1, x_{23}^* = 1, x_{12}^* = 0\)
    • 对偶变量:在 \(t = 4\) 时,我们有:
      • 从边(1,3)约束紧: \(y_0 - y_{\{1,3\}} = 3\),且 \(y_0 = 4\),得 \(y_{\{1,3\}} = 1\)
      • 从边(2,3)约束紧: \(y_0 - y_{\{2,3\}} = 4\),且 \(y_0 = 4\),得 \(y_{\{2,3\}} = 0\)
      • 边(1,2)约束: \(y_0 - y_{\{1,2\}} = 4 - 0 = 4 \leq 5\),是松的,所以对应的 \(x_{12}^* = 0\),满足原始互补松弛。
    • 检查对偶互补松弛:对于 \(S = \{1,3\}\)\(y_{\{1,3\}} = 1 > 0\),则对应原始约束应紧: \(\sum_{e \in E(\{1,3\})} x_e = x_{13} = 1\),而 \(|S|-1 = 1\),成立。对于 \(S = \{2,3\}\)\(y_{\{2,3\}} = 0\),其原始约束 \(x_{23} = 1\)\(|S|-1 = 1\),也是紧的,但对偶互补松弛条件不要求 \(y_S = 0\) 时原始约束必须松。所以满足。
  4. 对偶目标值\(2y_0 - (y_{\{1,2\}} + y_{\{1,3\}} + y_{\{2,3\}}) = 2*4 - (0+1+0) = 8 - 1 = 7\),等于原始最优树的总权重7。验证了强对偶定理。

总结
这个例子展示了如何通过对偶变量的逐步调整,模拟“连通分量合并”的过程,最终得到最小生成树。这个对偶算法本质上等价于经典的Kruskal算法,但提供了线性规划对偶理论的一个优美应用。通过将对偶变量 \(y_S\) 与“避免圈”的支付联系起来,每一步选择有效成本归零的边加入,最终构造出最小生成树,并验证了最优性条件。

基于线性规划的图最小生成树问题的对偶算法求解示例 题目描述 给定一个无向连通图 \( G = (V, E) \),其中 \( V \) 是顶点集,\( |V| = n \),\( E \) 是边集,\( |E| = m \)。每条边 \( e \in E \) 有一个非负的权重(或代价)\( c_ e \geq 0 \)。我们需要找到图 \( G \) 的一棵生成树(即一个包含所有顶点、无环的连通子图),使得其所有边的总权重最小。这是一个经典的 最小生成树 问题。 传统的算法如Kruskal或Prim算法能在多项式时间内直接解决此问题。然而,本题目要求我们 基于线性规划理论,通过对偶方法 来求解。具体来说,我们将: 构建最小生成树问题的线性规划模型。 写出其对偶线性规划。 解释对偶规划的经济/组合意义。 展示如何通过求解对偶规划,并结合互补松弛条件,来得到原问题(最小生成树)的最优解。 解题过程循序渐进讲解 步骤1:构建最小生成树问题的线性规划模型 我们需要为生成树中的边 \( e \) 引入决策变量 \( x_ e \in \{0, 1\} \):如果边 \( e \) 在生成树中,则 \( x_ e = 1 \),否则为 0。目标是总权重最小。 一个连通无向图成为生成树需要满足两个条件: 它恰好包含 \( n-1 \) 条边。 它不包含任何环。 条件1很容易表达为线性等式。条件2(无环)则复杂得多。对于一个包含 \( k \) 个顶点的集合 \( S \subseteq V \),其诱导子图中最多只能有 \( k-1 \) 条边,否则会形成环。因此,无环条件可以等价地表达为:对于任意非空顶点子集 \( S \subset V \)(即 \( S \neq \varnothing \) 且 \( S \neq V \)),其内部连接的边数不超过 \( |S|-1 \)。这个约束称为 子图消除约束 。 因此,最小生成树问题的 整数线性规划 模型如下: 原问题(P - 整数规划) 最小化:\[ \sum_ {e \in E} c_ e x_ e \] 满足: \[ \sum_ {e \in E} x_ e = n-1 \quad \quad \text{(边数约束)} \] \[ \sum_ {e \in E(S)} x_ e \leq |S| - 1, \quad \forall S \subset V, S \neq \varnothing, S \neq V \quad \text{(子图消除约束)} \] \[ x_ e \in \{0, 1\}, \quad \forall e \in E \] 其中 \( E(S) \) 表示两个端点都在集合 \( S \) 内部的边的集合。 线性规划松弛 :将整数约束 \( x_ e \in \{0,1\} \) 松弛为 \( 0 \leq x_ e \leq 1 \),得到一个线性规划。可以证明,这个线性规划的最优解中,每个 \( x_ e \) 自动是整数(0或1),因此松弛是紧的。这个结论源于图的 多面体理论 。所以我们直接求解其线性规划松弛即可。 步骤2:写出对偶线性规划 为了得到对偶,我们将原问题(P)的线性规划松弛重写为标准形式。 原问题的变量是 \( x_ e \)。约束包括: 一个等式约束:\( \sum_ {e} x_ e = n-1 \)。 无数个不等式约束(对每个非空真子集 \( S \)):\( \sum_ {e \in E(S)} x_ e \leq |S|-1 \)。 变量上界约束 \( x_ e \leq 1 \)(因为 \( x_ e \geq 0 \) 已在标准形式中隐含,但这里 \( x_ e \leq 1 \) 是从 \( x_ e \leq 1 \) 的自然上界得来,但在原始模型中未显式写出。实际上,在子图消除约束中,当 \( S = \{i, j\} \) 时,意味着对每条边 \( e = (i, j) \),有 \( x_ e \leq 1 \),所以不需要单独的上界约束)。 引入对偶变量: 对等式约束 \( \sum_ {e} x_ e = n-1 \),引入一个自由变量 \( y_ 0 \)(可以视为与“树”相关的全局变量)。 对每个子图消除约束(对应子集 \( S \)),引入一个非负变量 \( y_ S \geq 0 \)。 则对偶线性规划为: 对偶问题(D) 最大化:\[ (n-1) y_ 0 - \sum_ {S \subset V, S \neq \varnothing, S \neq V} (|S|-1) y_ S \] 满足: 对于每条边 \( e = (i, j) \in E \): \[ y_ 0 - \sum_ {S: e \in E(S)} y_ S \leq c_ e \] 其中,当 \( e = (i,j) \) 时,对偶约束的左边对所有包含顶点 \( i \) 和 \( j \) 的子集 \( S \) 进行求和(即 \( i \in S \) 且 \( j \in S \))。 同时,\( y_ S \geq 0 \) 对于所有 \( S \),且 \( y_ 0 \) 自由。 步骤3:简化对偶模型并解释其意义 上面的对偶模型有指数多个变量(\( 2^n - 2 \) 个 \( y_ S \))。但我们可以赋予其直观的经济意义。 对偶问题的解释(“收益共享”或“预算分配”) : 想象有一个“中心”管理者,他想让图连通。每条边有一个建设成本 \( c_ e \)。 对偶变量 \( y_ S \) 可以解释为:集合 \( S \) 中的顶点愿意共同支付一笔预算 \( y_ S \),来避免在其内部形成“圈”(即避免在 \( S \) 内部有过多的边)。 全局变量 \( y_ 0 \) 可以解释为整个树的价值(或每个顶点愿意为“连接”支付的单位费用)。 对偶目标:最大化 \( (n-1) y_ 0 - \sum_ S (|S|-1) y_ S \):这可以理解为“总连接收益减去避免形成圈的成本”的净收益。 对偶约束:对于每条边 \( e = (i, j) \),条件 \( y_ 0 - \sum_ {S: i, j \in S} y_ S \leq c_ e \) 意味着:如果要建设边 \( e \),其“有效收益”(总连接收益 \( y_ 0 \) 减去所有包含 \( i, j \) 的集合 \( S \) 的避免圈成本之和)不能超过其实际建设成本 \( c_ e \)。否则,建这条边就不划算。 步骤4:利用互补松弛条件构建算法 互补松弛条件连接了原问题最优解 \( x^* \) 和对偶问题最优解 \( (y_ 0^ , \{y_ S^ \}) \): 原始互补松弛条件 : 如果 \( x_ e^* > 0 \)(即边 \( e \) 在生成树中),则对应的对偶约束必须是紧的:\( y_ 0^* - \sum_ {S: e \in E(S)} y_ S^* = c_ e \)。 如果对偶约束是松的(严格不等式),则 \( x_ e^* = 0 \)。 对偶互补松弛条件 : 如果 \( y_ S^* > 0 \),则对应的原始约束(子图消除约束)是紧的:\( \sum_ {e \in E(S)} x_ e^* = |S| - 1 \)。 如果原始约束是松的(严格不等式),则 \( y_ S^* = 0 \)。 对偶算法的核心思想 : 我们可以通过设置对偶变量,使得某些对偶约束变紧,从而“允许”一些边以零缩减成本进入生成树候选集,然后逐渐调整对偶变量,直到找到满足互补松弛条件的一组解。 这实际上是 Kruskal算法 和 Prim算法 的对偶视角。例如,在Kruskal算法中,我们按边权从小到大排序,依次加入不形成圈的边。这个过程等价于以下对偶过程: 初始化所有 \( y_ S = 0 \)。 设 \( y_ 0 \) 为某个值 \( t \)。 随着 \( t \) 从0逐渐增加,对于每条边 \( e \),其“有效成本” \( c_ e' = c_ e - y_ 0 + \sum_ {S: e \in E(S)} y_ S \) 会变化。当 \( c_ e' \) 降为0时,这条边成为候选边。 当我们加入一条边时,如果它连接了两个连通分量(即一个森林中的两棵树),则相当于合并了两个集合。这可以解释为:我们设置某个 \( y_ S > 0 \) 来“支付”以避免在某个集合内部形成多余的边,从而使得该边的有效成本降至0。 步骤5:一个具体的示例 考虑一个简单图:顶点集 \( V = \{1,2,3\} \),边 \( e_ {12} \) 权重 5, \( e_ {13} \) 权重 3, \( e_ {23} \) 权重 4。 目标 :用对偶方法找到最小生成树。 构建对偶模型 : 对偶变量: \( y_ 0 \)(自由), \( y_ {\{1,2\}} \geq 0 \), \( y_ {\{1,3\}} \geq 0 \), \( y_ {\{2,3\}} \geq 0 \)。(对于3个顶点的图,非平凡真子集就是每个2顶点集) 对偶约束: 边(1,2): \( y_ 0 - y_ {\{1,2\}} \leq 5\) 边(1,3): \( y_ 0 - y_ {\{1,3\}} \leq 3\) 边(2,3): \( y_ 0 - y_ {\{2,3\}} \leq 4\) 目标:最大化 \( (n-1) y_ 0 - \sum_ S (|S|-1) y_ S = 2 y_ 0 - (y_ {\{1,2\}} + y_ {\{1,3\}} + y_ {\{2,3\}})\)。 用“增大 \( y_ 0 \)”的思想求解 : 初始所有 \( y_ S = 0 \)。我们增大 \( y_ 0 \),直到某条边的对偶约束变紧(等号成立)。 当 \( y_ 0 = 3 \) 时,边(1,3)的约束变紧:\( 3 - 0 = 3 = c_ {13} \)。此时边(1,3)的有效成本为0,我们可考虑将其加入生成树。 加入边(1,3)后,顶点{1,3}连通。为了避免在集合{1,3}中再添加多余边(否则会形成环),我们“激活”对应的对偶变量 \( y_ {\{1,3\}} \)。 允许 \( y_ {\{1,3\}} \) 增加,同时保持边(1,3)的约束紧: \( y_ 0 - y_ {\{1,3\}} = 3 \)。 现在,为了继续扩大连通部分,我们继续增大 \( y_ 0 \)。 随着 \( y_ 0 \) 增大,边(1,2)和(2,3)的有效成本 \( c_ e' = c_ e - y_ 0 + y_ S \) 在变化。注意,对于边(2,3),其端点在当前连通分量之外,所以尚未有 \( y_ S \) 起作用(即 \( y_ {\{2,3\}} \) 仍为0,因为{2,3}不在同一个已连通集合中)。 我们需要计算下一个变紧的边。 设 \( y_ 0 = t \),由 \( y_ 0 - y_ {\{1,3\}} = 3 \) 得 \( y_ {\{1,3\}} = t - 3 \)。 检查边(1,2):约束为 \( t - y_ {\{1,2\}} \leq 5 \),目前 \( y_ {\{1,2\}} = 0 \),所以当 \( t = 5 \) 时变紧。 边(2,3):约束为 \( t - y_ {\{2,3\}} \leq 4 \),目前 \( y_ {\{2,3\}} = 0 \),当 \( t = 4 \) 时变紧。 所以下一个变紧的是边(2,3),在 \( t = 4 \) 时。加入边(2,3)。现在连通了顶点{2,3},但与{1,3}是分开的两个连通分量。 将{2,3}合并为一个连通分量,激活 \( y_ {\{2,3\}} \),并保持其约束紧: \( y_ 0 - y_ {\{2,3\}} = 4 \),所以 \( y_ {\{2,3\}} = t - 4 \)。 现在有两个连通分量:{1,3} 和 {2}(实际上{2,3}已连通,但注意边(1,3)连接了1和3,边(2,3)连接了2和3,所以实际上三个顶点已通过边(1,3)和(2,3)连通了!)。 检查边(1,2):其两个端点分别在集合{1,3}和{2,3}中,但这两个集合的交集是顶点3,所以实际上边(1,2)连接了两个已连通的集合吗?让我们看当前连通状态:顶点1、3通过边(1,3)连通;顶点2、3通过边(2,3)连通。因此,顶点1、2、3已全部连通,且我们已经有了2条边,恰好是 \( n-1 = 2 \) 条边,所以已经形成了一棵生成树:边集为{(1,3), (2,3)},总权重 = 3+4 = 7。 验证互补松弛 : 原始解: \( x_ {13}^* = 1, x_ {23}^* = 1, x_ {12}^* = 0 \)。 对偶变量:在 \( t = 4 \) 时,我们有: 从边(1,3)约束紧: \( y_ 0 - y_ {\{1,3\}} = 3 \),且 \( y_ 0 = 4 \),得 \( y_ {\{1,3\}} = 1 \)。 从边(2,3)约束紧: \( y_ 0 - y_ {\{2,3\}} = 4 \),且 \( y_ 0 = 4 \),得 \( y_ {\{2,3\}} = 0 \)。 边(1,2)约束: \( y_ 0 - y_ {\{1,2\}} = 4 - 0 = 4 \leq 5 \),是松的,所以对应的 \( x_ {12}^* = 0 \),满足原始互补松弛。 检查对偶互补松弛:对于 \( S = \{1,3\} \), \( y_ {\{1,3\}} = 1 > 0 \),则对应原始约束应紧: \( \sum_ {e \in E(\{1,3\})} x_ e = x_ {13} = 1 \),而 \( |S|-1 = 1 \),成立。对于 \( S = \{2,3\} \), \( y_ {\{2,3\}} = 0 \),其原始约束 \( x_ {23} = 1 \), \( |S|-1 = 1 \),也是紧的,但对偶互补松弛条件不要求 \( y_ S = 0 \) 时原始约束必须松。所以满足。 对偶目标值 : \( 2y_ 0 - (y_ {\{1,2\}} + y_ {\{1,3\}} + y_ {\{2,3\}}) = 2* 4 - (0+1+0) = 8 - 1 = 7 \),等于原始最优树的总权重7。验证了强对偶定理。 总结 : 这个例子展示了如何通过对偶变量的逐步调整,模拟“连通分量合并”的过程,最终得到最小生成树。这个对偶算法本质上等价于经典的Kruskal算法,但提供了线性规划对偶理论的一个优美应用。通过将对偶变量 \( y_ S \) 与“避免圈”的支付联系起来,每一步选择有效成本归零的边加入,最终构造出最小生成树,并验证了最优性条件。