如何将最大基数二分匹配减少到最小路径覆盖?

时间:2014-12-18 13:35:17

标签: algorithm network-flow

我读过这两个问题:link1 link2

以及此wikipedia

但我无法理解如何解决最大匹配问题以解决最小路径覆盖问题。我知道解决方案是n-m,其中n是G中的顶点数,m是最大匹配,但我找不到原因

2 个答案:

答案 0 :(得分:2)

这是对这一事实的直观解释(这不是一个严格的证据):让我们看一下路径封面中的每条路径。除路径中的第一个顶点外,每个顶点都有一个唯一的前驱。而且,每个顶点只有一个后继(除了每个路径中的最后一个)。这就是我们可以说每个顶点与其前身匹配的原因。如果顶点与任何东西都不匹配,则它是某个路径中的第一个顶点。这就是为什么路径的数量等于不匹配的顶点的数量(每个路径只有一个第一个顶点)。不匹配顶点的数量显然等于顶点总数减去匹配顶点数。这就是我们获得n - m公式的方式。最大匹配的大小不可能得到更少的路径(否则n - m1 < n - m =&gt; m1 > m =&gt; m不是最大值。同时,我们可以明确地构建一个具有n - m路径的解决方案。

答案 1 :(得分:0)

  • 左边有n个节点&amp; m个节点在右边。
  • 匹配后,您可以计算maxFlow f - 最大匹配数。
  • 左边的节点&amp;右边的f个节点已经在最小边缘覆盖。
  • 左边是那些没有匹配的n-f个节点,右边那里有这样的节点。
  • 这些节点尚未覆盖,因为最大匹配并不包括它们。
  • 这些节点中的每一个都可以连接到最小边缘盖。所以它增加了(n-f)+(m-f)个边缘。
  • 所以总的最小覆盖是f +(n-f)+(m-f)= n + m-f

这是最小边缘问题:https://code.google.com/codejam/contest/11254486/dashboard#s=p2&a=2