最大二分匹配方法中的错误

Posted

技术标签:

【中文标题】最大二分匹配方法中的错误【英文标题】:Error in an approach to Maximum Bipartite matching 【发布时间】:2016-04-30 21:59:55 【问题描述】:

一个有源和汇的二部图如下所示。每条边的容量为 1 个单位: Source : GeeksforGeeks

我正在尝试找到从源到接收器的最大流量。一种方法是使用适用于所有图的最大流量问题的 Ford-Fulkerson 算法。 我找到了一种简单的方法来找到最大流量(太简单了,不正确!),我无法在该方法中找到任何错误。

方法:

c1 = 计算具有非零边数的顶点数,在具有出边的顶点列表中。

c2 = 计算在具有传入边的顶点列表中收敛到它的边数非零的顶点数。

最大流量将是这两个数字中的最小值,即 min(c1,c2)。[因为任何路径都需要一个来自传出顶点列表的顶点,而另一个来自传入顶点列表。]

任何帮助将不胜感激。

【问题讨论】:

【参考方案1】:

考虑一个类似的图表

*--*
  /
 /
*  *
  /
 /
*--*

(连接组件工作的补丁并​​不能解决问题;将左下角连接到右上角。)

【讨论】:

非常感谢。我正在寻找这个。 这是我在 Stack Overflow 上的第一个问题。不知道这件事。谢谢。【参考方案2】:

没有确切的答案,但我有一个可行的迭代算法。 对我来说,您显然需要平衡流,以便它分布在可以将其发送到可以接收它的右顶点的左侧顶点之间。 假设您使用包含双向链接的矩阵 A 对您的情况进行建模。然后,您可以假设,如果您的矩阵恰好包含您想要通过边的流量(0 到 1 之间),那么给出此决定的总流量为 b=A*a,其中 a 是一个向量。 如果您从 A 的最大容量开始,将所有边设置为 1,将所有其他边设置为 0,则 b 的某些元素可能大于 1,但您可以减少它们对应的 A 元素,以使它们通过更少的流量。 然后您可以恢复流程并查看您的二分部分的最大接收容量是多少,并使用 a=A'b 进行测试。 同样,您可能拥有大于 1 的 a 元素,这意味着理想流将大于从源到元素的可能容量,并减少 A 流中的这些元素。 使用这种乒乓算法并逐步减少校正,您可以保证收敛到最优矩阵。 给定一个带有一个向量的最终 b=Aa,您的最大流量将是 sum(b)。 看下面的八度代码,我用B作为收敛矩阵,让我知道你的cmets。

A=[0 1 0 1;1 0 0 1;1 1 0 0;0 0 1 0];
B=A;
repeat
  b=B*ones(4,1);
  B=B.*([.8 .8 .8 1]'*ones(1,4));
  a=B'*ones(4,1)
  B=B.*(ones(4,1)*[.9 .9 1 .9]);
until converge
maxflow=sum(b)

【讨论】:

以上是关于最大二分匹配方法中的错误的主要内容,如果未能解决你的问题,请参考以下文章

最大二分匹配

二分图最大匹配

C 或 Python 中的快速最大二分匹配

匈牙利算法求二分图的最大匹配数

861. 二分图的最大匹配(匈牙利算法模板)

匈牙利算法dfs模板 [二分图][二分图最大匹配]