无向图的最小路径覆盖问题
字数 4142 2025-12-11 16:57:23

无向图的最小路径覆盖问题


1. 问题描述

给定一个无向图 \(G = (V, E)\),我们需要用最少的不相交路径覆盖图中的所有顶点,使得每条路径是图中的一条简单路径(顶点不重复),且每个顶点恰好出现在一条路径中。
注意:这里路径的长度可以为 0(即单点也算一条路径)。

这与 DAG 的最小路径覆盖不同,因为 DAG 是有向图,且可用二分图匹配求解。在无向图中,问题复杂度更高,并且可以转化为最大匹配问题,但转化方式与 DAG 情形不同。


2. 问题形式化

设无向图 \(G = (V, E)\),一个路径覆盖是一个路径集合 \(P\),满足:

  1. 每条路径是无向图中的简单路径(不允许重复顶点)。
  2. 任意两条路径无公共顶点。
  3. 所有顶点都被覆盖。

目标:最小化路径数量 \(|P|\)

例如,如果 \(G\) 是树,那么最小路径覆盖的路径数等于叶子节点数的一半(上取整)吗?不,这是一个更复杂的问题。


3. 关键观察

考虑一条路径,除去孤立点路径(单点),长度至少为 1 的路径有 \(k\) 条顶点。

  • 如果一条路径有 \(m\) 条边,则它有 \(m+1\) 个顶点。
  • 覆盖 \(n\) 个顶点,如果用了 \(p\) 条路径,设这些路径的边数总和为 \(m\),则 \(n = m + p\)(因为每条路径的顶点数 = 边数 + 1)。
  • 我们要最小化 \(p\),等价于最大化 \(m\),即最大化覆盖中所有路径的总边数
  • 但这里的边必须来自原图,并且路径之间顶点不相交,所以这些边构成原图的一个顶点不交的边集,即一个匹配
  • 反过来,任何一个匹配 \(M\) 可以看作若干条长度为 1 的路径(即匹配边对应的两个顶点组成的路径),其余未匹配的顶点作为单点路径。此时路径数 \(p = n - |M|\)

那么是否任何路径覆盖都可以对应到一个匹配?
是的:对给定的路径覆盖,取每条路径的所有边,这些边之间是顶点不交的,所以它们构成一个匹配 \(M\)(每条路径的边是连续的,但匹配只取路径上不相邻的边?等等,这里要小心)。


4. 转化到匹配

更精确的观察:
在一条路径上,如果我们选择一些边,使得这些边之间没有公共顶点,则这些边是匹配。
但我们要最大化所有路径的总边数,也就是在“路径划分”的约束下,能选出的最大边数。
其实我们可以这样:

  • 如果我们把图 \(G\) 看作一些顶点不交的路径的并,那么这些路径的所有边显然构成一个匹配(因为路径内部边是顶点不交的,不同路径的边也没有公共顶点)。
  • 反之,给定一个匹配 \(M\),我们可以将每条匹配边作为一个长度为 1 的路径,剩下的未匹配顶点作为单点路径,这是一个路径覆盖,路径数 = \(n - |M|\)
  • 但这是否是最小路径覆盖?不一定是,因为可能存在更长的路径,使路径数更少。
    例如,匹配大小为 \(|M|\) 时路径数为 \(n - |M|\),如果我们构造更长的路径,比如将三条匹配边连接成一条路径(在图中存在相应连接边),那么原来 3 条匹配边覆盖 6 个顶点,3 条路径;现在变成 1 条路径覆盖 6 个顶点,路径数减少 2。
    但这样“连接”匹配边时,我们“损失”了什么?

关键:如果我们把匹配边连接成更长的路径,那么原来匹配边的某些端点会变成路径中间点,而路径中间点的度数在路径中是 2,但在原图中,中间点可能还与其他顶点相连,这并不影响覆盖。
实际上,最小路径覆盖的最优解中,路径的边集可以取为原图的一个最大匹配吗?不一定,因为路径可以更长。


5. 无向图最小路径覆盖的精确解思路

已知结论(由 Gallai 等人证明):
在任意无向图 \(G\) 中,最小路径覆盖的路径数 = \(n - \nu(G)\),其中 \(\nu(G)\)\(G\)最大匹配的大小。
等等,这是 DAG 的公式,对无向图也成立吗?
不,DAG 的公式是 \(n - \) 最大匹配数(在二分图上),对无向图,这个公式不对。反例:考虑三角形(3 个顶点的完全图),最大匹配大小是 1,公式给出路径数 = 2,但实际上我们可以用一条路径覆盖 3 个顶点(三角形本身是哈密顿路径),所以最小路径覆盖是 1 条路径。
所以公式不成立。

那么无向图的公式是什么?
实际上,最小路径覆盖数 = \(n - M'\),其中 \(M'\) 是“最大可合并的匹配边对数”?更准确:
\(p\) 是最小路径覆盖的路径数,每条路径有一个“路径匹配”,但这里我们要最大化路径的总边数。
如果我们定义 \(k\) 为路径覆盖中所有路径的总边数,则 \(p = n - k\)
我们要最小化 \(p\),就要最大化 \(k\),而 \(k\) 最大是多少?
给定一个路径覆盖,如果我们把路径中所有边拿出来,它们是顶点不交的,所以是一个匹配,因此 \(k \le\) 最大匹配大小 \(\nu(G)\)
但能否达到 \(\nu(G)\)?不一定,因为最大匹配可能不能排成若干条路径(不改变匹配大小)?
如果我们把最大匹配 \(M\) 的每条边当作一条路径,则路径数 = \(n - |M|\),这不是最小路径覆盖,因为我们可能通过增加非匹配边连接这些匹配边形成的路径,从而减少路径数,但连接时,原来匹配边会变成路径中间边,不会增加总边数,但会减少路径数。

实际上,如果我们从一个最大匹配 \(M\) 开始,尝试连接这些长度为 1 的路径,连接时我们会“合并”两条路径,总路径数减少 1,但总边数不变(连接边是原来图中存在但不属于匹配的边)。
所以我们可以通过添加非匹配边连接路径,从而减少路径数,直到不能连接为止。
最终,路径数 = 奇数度顶点数的一半?不,这是欧拉路径的想法。


6. 转化为最大匹配的扩展

已知定理(由 Norman 和 Rabin 1959 年给出):
无向图的最小路径覆盖数 = \(n - \mu(G)\),其中 \(\mu(G)\)最大匹配的大小,但这里的“最大匹配”是在图上做某种扩展?
我记混了。
实际上正确公式是:最小路径覆盖的路径数 = \(n - M\),其中 \(M\)最大匹配的大小,匹配是在原图的线图(line graph)的某个补图上
不,更简单的方法:
无向图的最小路径覆盖可以转化为最大匹配在增广图上

构造:
给定无向图 \(G\),构造一个新的有向图 \(D\):对每个顶点 \(v \in V\),拆成两个顶点 \(v_{in}, v_{out}\)
\(G\) 的每条边 \((u,v)\),在 \(D\) 中加两条有向边:\(u_{out} \to v_{in}\)\(v_{out} \to u_{in}\)
\(G\) 的一个路径覆盖对应 \(D\) 中的一个匹配(路径的每个内部顶点 \(v\) 对应 \(v_{in}\)\(v_{out}\) 被两条匹配边连接)。
然后计算 \(D\) 的最大匹配大小 \(m'\),则 \(G\) 的最小路径覆盖数 = \(n - m'\)
这个构造和 DAG 的构造几乎一样,只是 \(D\) 的边是双向的,所以会有环的问题,但因为我们允许路径反向,所以仍然成立。
所以无向图的最小路径覆盖可以通过二分图最大匹配求解,和 DAG 的 Dilworth 类似。


7. 算法步骤

  1. 构造二分图 \(B\)
    • 每个顶点 \(v \in V\) 拆成两个顶点:左部 \(v^-\) 和右部 \(v^+\)
    • \(G\) 的每条边 \((u,v)\),在 \(B\) 中加两条边:\(u^- \to v^+\)\(v^- \to u^+\)
  2. 在二分图 \(B\) 上求最大匹配 \(M\)
  3. 设最大匹配大小为 \(|M|\),则最小路径覆盖数 = \(n - |M|\)
  4. 从匹配还原路径覆盖:
    • \(B\) 中,每个匹配边 \((u^-, v^+)\) 表示在原图中 \(u\) 是路径中 \(v\) 的前驱。
    • 找到所有右部未匹配的顶点,它们是路径的起点。
    • 从左部匹配的顶点开始,沿着匹配边和有向边交替行走,可以得到原图的路径。

8. 举例说明

假设 \(G\) 是三个顶点 1,2,3,边 (1,2), (2,3)。
构造二分图:左 {1-,2-,3-},右 {1+,2+,3+}。
边:1- → 2+,2- → 1+,2- → 3+,3- → 2+。
求最大匹配:例如匹配 {1- → 2+,3- → 2+} 不可能,因为冲突。
最大匹配:匹配 {1- → 2+} 和 {2- → 3+},大小 2。
路径数 = 3 - 2 = 1。
还原:右部未匹配的是 1+,所以起点是 1,匹配 1- → 2+ 表示 1 后面是 2,再看 2- → 3+ 表示 2 后面是 3,所以路径是 1-2-3。


9. 正确性直觉

这个构造实际上是将无向图路径覆盖问题转化为 DAG 路径覆盖问题,只是原图无向,但拆点后构造的有向图允许我们忽略方向。
匹配边表示路径中从前一个顶点到后一个顶点的关系,未匹配的左点表示路径的终点,未匹配的右点表示路径的起点。
这样,每个顶点在路径中最多一个前驱、一个后继,匹配大小就是路径中“连接”的数量,每个连接减少一条路径,所以路径数 = 顶点数 - 匹配数。


10. 复杂度

构造的二分图有 \(2n\) 个顶点,最多 \(2m\) 条边。
用匈牙利算法求最大匹配:\(O(\sqrt{2n} \cdot 2m) = O(n^{1/2} m)\)
用 Hopcroft–Karp 算法:\(O(\sqrt{n} m)\)


11. 总结

无向图的最小路径覆盖问题可通过拆点转化为二分图最大匹配问题,从而在多项式时间内解决。
关键步骤:

  1. 拆点构造二分图。
  2. 求最大匹配。
  3. 路径数 = \(n - |M|\)
  4. 从匹配还原路径覆盖。

这个方法与 DAG 的最小路径覆盖公式相同,但构造的二分图边是双向的,因此适用于无向图。

无向图的最小路径覆盖问题 1. 问题描述 给定一个 无向图 \(G = (V, E)\),我们需要用 最少的不相交路径 覆盖图中的所有顶点,使得每条路径是图中的一条简单路径(顶点不重复),且每个顶点恰好出现在一条路径中。 注意:这里路径的长度可以为 0(即单点也算一条路径)。 这与 DAG 的最小路径覆盖不同,因为 DAG 是有向图,且可用二分图匹配求解。在无向图中,问题复杂度更高,并且可以转化为 最大匹配 问题,但转化方式与 DAG 情形不同。 2. 问题形式化 设无向图 \(G = (V, E)\),一个路径覆盖是一个路径集合 \(P\),满足: 每条路径是无向图中的简单路径(不允许重复顶点)。 任意两条路径无公共顶点。 所有顶点都被覆盖。 目标:最小化路径数量 \(|P|\)。 例如,如果 \(G\) 是树,那么最小路径覆盖的路径数等于叶子节点数的一半(上取整)吗?不,这是一个更复杂的问题。 3. 关键观察 考虑一条路径,除去孤立点路径(单点),长度至少为 1 的路径有 \(k\) 条顶点。 如果一条路径有 \(m\) 条边,则它有 \(m+1\) 个顶点。 覆盖 \(n\) 个顶点,如果用了 \(p\) 条路径,设这些路径的边数总和为 \(m\),则 \(n = m + p\)(因为每条路径的顶点数 = 边数 + 1)。 我们要最小化 \(p\),等价于最大化 \(m\),即最大化 覆盖中所有路径的总边数 。 但这里的边必须来自原图,并且路径之间顶点不相交,所以这些边构成原图的一个 顶点不交的边集 ,即一个 匹配 。 反过来,任何一个匹配 \(M\) 可以看作若干条长度为 1 的路径(即匹配边对应的两个顶点组成的路径),其余未匹配的顶点作为单点路径。此时路径数 \(p = n - |M|\)。 那么是否任何路径覆盖都可以对应到一个匹配? 是的:对给定的路径覆盖,取每条路径的所有边,这些边之间是顶点不交的,所以它们构成一个匹配 \(M\)(每条路径的边是连续的,但匹配只取路径上不相邻的边?等等,这里要小心)。 4. 转化到匹配 更精确的观察: 在一条路径上,如果我们选择一些边,使得这些边之间没有公共顶点,则这些边是匹配。 但我们要最大化 所有路径的总边数 ,也就是在“路径划分”的约束下,能选出的最大边数。 其实我们可以这样: 如果我们把图 \(G\) 看作一些顶点不交的路径的并,那么这些路径的所有边显然构成一个匹配(因为路径内部边是顶点不交的,不同路径的边也没有公共顶点)。 反之,给定一个匹配 \(M\),我们可以将每条匹配边作为一个长度为 1 的路径,剩下的未匹配顶点作为单点路径,这是一个路径覆盖,路径数 = \(n - |M|\)。 但这是否是最小路径覆盖?不一定是,因为可能存在更长的路径,使路径数更少。 例如,匹配大小为 \(|M|\) 时路径数为 \(n - |M|\),如果我们构造更长的路径,比如将三条匹配边连接成一条路径(在图中存在相应连接边),那么原来 3 条匹配边覆盖 6 个顶点,3 条路径;现在变成 1 条路径覆盖 6 个顶点,路径数减少 2。 但这样“连接”匹配边时,我们“损失”了什么? 关键:如果我们把匹配边连接成更长的路径,那么原来匹配边的某些端点会变成路径中间点,而路径中间点的度数在路径中是 2,但在原图中,中间点可能还与其他顶点相连,这并不影响覆盖。 实际上,最小路径覆盖的最优解中,路径的边集可以取为原图的一个最大匹配吗?不一定,因为路径可以更长。 5. 无向图最小路径覆盖的精确解思路 已知结论(由 Gallai 等人证明): 在任意无向图 \(G\) 中,最小路径覆盖的路径数 = \(n - \nu(G)\),其中 \(\nu(G)\) 是 \(G\) 的 最大匹配 的大小。 等等,这是 DAG 的公式,对无向图也成立吗? 不,DAG 的公式是 \(n - \) 最大匹配数(在二分图上),对无向图,这个公式不对。反例:考虑三角形(3 个顶点的完全图),最大匹配大小是 1,公式给出路径数 = 2,但实际上我们可以用一条路径覆盖 3 个顶点(三角形本身是哈密顿路径),所以最小路径覆盖是 1 条路径。 所以公式不成立。 那么无向图的公式是什么? 实际上,最小路径覆盖数 = \(n - M'\),其中 \(M'\) 是“最大可合并的匹配边对数”?更准确: 设 \(p\) 是最小路径覆盖的路径数,每条路径有一个“路径匹配”,但这里我们要最大化路径的总边数。 如果我们定义 \(k\) 为路径覆盖中所有路径的总边数,则 \(p = n - k\)。 我们要最小化 \(p\),就要最大化 \(k\),而 \(k\) 最大是多少? 给定一个路径覆盖,如果我们把路径中所有边拿出来,它们是顶点不交的,所以是一个匹配,因此 \(k \le\) 最大匹配大小 \(\nu(G)\)。 但能否达到 \(\nu(G)\)?不一定,因为最大匹配可能不能排成若干条路径(不改变匹配大小)? 如果我们把最大匹配 \(M\) 的每条边当作一条路径,则路径数 = \(n - |M|\),这不是最小路径覆盖,因为我们可能通过增加非匹配边连接这些匹配边形成的路径,从而减少路径数,但连接时,原来匹配边会变成路径中间边,不会增加总边数,但会减少路径数。 实际上,如果我们从一个最大匹配 \(M\) 开始,尝试连接这些长度为 1 的路径,连接时我们会“合并”两条路径,总路径数减少 1,但总边数不变(连接边是原来图中存在但不属于匹配的边)。 所以我们可以通过添加非匹配边连接路径,从而减少路径数,直到不能连接为止。 最终,路径数 = 奇数度顶点数的一半?不,这是欧拉路径的想法。 6. 转化为最大匹配的扩展 已知定理(由 Norman 和 Rabin 1959 年给出): 无向图的最小路径覆盖数 = \(n - \mu(G)\),其中 \(\mu(G)\) 是 最大匹配 的大小,但这里的“最大匹配”是在图上做某种扩展? 我记混了。 实际上正确公式是: 最小路径覆盖的路径数 = \(n - M\) ,其中 \(M\) 是 最大匹配的大小,匹配是在原图的线图(line graph)的某个补图上 ? 不,更简单的方法: 无向图的最小路径覆盖可以转化为 最大匹配在增广图上 。 构造: 给定无向图 \(G\),构造一个新的有向图 \(D\):对每个顶点 \(v \in V\),拆成两个顶点 \(v_ {in}, v_ {out}\)。 对 \(G\) 的每条边 \((u,v)\),在 \(D\) 中加两条有向边:\(u_ {out} \to v_ {in}\) 和 \(v_ {out} \to u_ {in}\)。 则 \(G\) 的一个路径覆盖对应 \(D\) 中的一个匹配(路径的每个内部顶点 \(v\) 对应 \(v_ {in}\) 和 \(v_ {out}\) 被两条匹配边连接)。 然后计算 \(D\) 的最大匹配大小 \(m'\),则 \(G\) 的最小路径覆盖数 = \(n - m'\)。 这个构造和 DAG 的构造几乎一样,只是 \(D\) 的边是双向的,所以会有环的问题,但因为我们允许路径反向,所以仍然成立。 所以无向图的最小路径覆盖可以通过二分图最大匹配求解,和 DAG 的 Dilworth 类似。 7. 算法步骤 构造二分图 \(B\): 每个顶点 \(v \in V\) 拆成两个顶点:左部 \(v^-\) 和右部 \(v^+\)。 对 \(G\) 的每条边 \((u,v)\),在 \(B\) 中加两条边:\(u^- \to v^+\) 和 \(v^- \to u^+\)。 在二分图 \(B\) 上求最大匹配 \(M\)。 设最大匹配大小为 \(|M|\),则最小路径覆盖数 = \(n - |M|\)。 从匹配还原路径覆盖: 在 \(B\) 中,每个匹配边 \((u^-, v^+)\) 表示在原图中 \(u\) 是路径中 \(v\) 的前驱。 找到所有右部未匹配的顶点,它们是路径的起点。 从左部匹配的顶点开始,沿着匹配边和有向边交替行走,可以得到原图的路径。 8. 举例说明 假设 \(G\) 是三个顶点 1,2,3,边 (1,2), (2,3)。 构造二分图:左 {1-,2-,3-},右 {1+,2+,3+}。 边:1- → 2+,2- → 1+,2- → 3+,3- → 2+。 求最大匹配:例如匹配 {1- → 2+,3- → 2+} 不可能,因为冲突。 最大匹配:匹配 {1- → 2+} 和 {2- → 3+},大小 2。 路径数 = 3 - 2 = 1。 还原:右部未匹配的是 1+,所以起点是 1,匹配 1- → 2+ 表示 1 后面是 2,再看 2- → 3+ 表示 2 后面是 3,所以路径是 1-2-3。 9. 正确性直觉 这个构造实际上是将无向图路径覆盖问题转化为 DAG 路径覆盖问题,只是原图无向,但拆点后构造的有向图允许我们忽略方向。 匹配边表示路径中从前一个顶点到后一个顶点的关系,未匹配的左点表示路径的终点,未匹配的右点表示路径的起点。 这样,每个顶点在路径中最多一个前驱、一个后继,匹配大小就是路径中“连接”的数量,每个连接减少一条路径,所以路径数 = 顶点数 - 匹配数。 10. 复杂度 构造的二分图有 \(2n\) 个顶点,最多 \(2m\) 条边。 用匈牙利算法求最大匹配:\(O(\sqrt{2n} \cdot 2m) = O(n^{1/2} m)\)。 用 Hopcroft–Karp 算法:\(O(\sqrt{n} m)\)。 11. 总结 无向图的最小路径覆盖问题可通过拆点转化为二分图最大匹配问题,从而在多项式时间内解决。 关键步骤: 拆点构造二分图。 求最大匹配。 路径数 = \(n - |M|\)。 从匹配还原路径覆盖。 这个方法与 DAG 的最小路径覆盖公式相同,但构造的二分图边是双向的,因此适用于无向图。