二部图中的双重匹配

Double-matching in a bipartite graph

我在学习算法测试时遇到了以下问题,但没有发布答案:

  1. 最大双重匹配问题-给定一个二分图G=(V=(LUR),E)描述了一个算法returns E中的一组边M s.t 对于 V 中的每个顶点 v,M 中最多有 2 条边包含最大尺寸的 v。

  2. 定义:"Strong double matching"是双重匹配s.t对于V中的每个顶点v,M中至少有一条边包含v。给定一个二分图G =(V=(LUR),E)和strong double matching M,描述了一种算法,returns最大尺寸的strong double matching M'。证明你的答案。

所以我已经设法解决了

1) 使用减少到最大流:将顶点的 s 和 t 以及从 s 到 L 的边和从 R 到 t 的边相加,每个边的容量为 2,并定义 L 和 R 之间每条边的容量为无限的能力。使用 Dinic 算法找到最大流量并返回 L 和 R 之间具有正流量的所有边。

关于 2) 我考虑过以某种方式操纵网络,以便每个顶点都有正向流,然后以某种方式使用算法来构造最大解。有什么想法吗?运行时限制为 O(V^2E)(Dinics 运行时)

这是一个 O(n^3) 的解决方案,使用 minimum cost flow

回想一下我们是如何为标准二分匹配建立网络的。

  1. 对于来自 L 的每个顶点 u,添加来自 S 的单位容量边至 u;
  2. 对于每条边 u-v,其中 u 来自 Lv来自R,添加一条从uv的边。注意它的容量无所谓,只要至少是一个即可;
  3. 对于来自 R 的每个顶点 v,添加来自 u 的单位容量边至 R.

现在我们保持中间部分不变,左右部分稍微改变一下。

  1. 对于来自 L 的每个顶点 u,从 Su,其中一个成本为 -1,另一个成本为 0;

边相同 v->S.

忽略成本,这与您自己构建的网络相同。这里的最大流量对应最大双匹配

现在让我们找出大小为 k 的最小成本流。它对应于一些双重匹配,其中它对应于接触最大可能数量的顶点的匹配,因为接触一个顶点(即,推动至少单位流通过它)会使成本降低 1。此外,接触第二次的顶点不会降低成本,因为第二条边的成本为 0.

我们如何得到解决方案:对于每个 k = 1, ..., 2n 迭代地找到最小成本流并取对应于最小成本的值。

使用 Johnson's algorithm(也称为带势的 Dijkstra)每次迭代给出 O(n^2),总的来说是 O(n^3)。

P.S。 Dinic 算法在单位图上的运行时间更好,在二部图上达到 O(E sqrt(V))。