计算二分图中的匹配

时间:2014-08-04 16:27:17

标签: c++ algorithm graph-theory bipartite

我有一个二边图,一边有N个节点,另一边有近100个节点。 现在我需要对匹配进行计数,使得第一部分中的每个节点都具有到其他部分中的某个节点的链接,使得第一部分中没有两个节点与第二部分中的相同节点匹配。(就像一个作业可以分配给一个申请人)

现在我知道找到这个数量并不容易,并且是#P-hard问题(来自链接:https://cs.stackexchange.com/questions/19924/counting-and-finding-all-perfect-maximum-matchings-in-general-graphs

但是这样做的可行方法是什么?有人可以用一些代码或伪代码解释。

假设输入就像我们有X对,显示你连接到v

如果N = 2且X = 4且对为(1,1),(1,2),(2,3),(2,4)。

1 个答案:

答案 0 :(得分:1)

对于小N,可能存在动态编程解决方案,其中2 ^ N是实际数字。

用N×100表表示图形,当从一侧到另一侧有链接时,条目标记为真。对于i = 1..100,我们将计算出Count(i,x),其中x在0..2 ^ N-1的范围内并且表示N侧的一组节点。 Count(i,x)将是N侧的集合x中的节点与100侧的前i个节点之间的匹配数量的计数。

我们可以通过考虑i和x中的一个节点之间匹配的情况和不存在的情况,从Count(i-1,*)计算出Count(i,x)。没有得分的情况Count(i - 1,x) - 创建不使用i的匹配的方式的数量。对于x中的每个设置位,如果存在从i到该位表示的节点的链接,则将y作为x的位模式,该位未设置,并将Count(i-1,y)添加到计数中。 Count(i,x)是所有这些计数的总和。

最终答案是Count(100,2 ^ N-1) - 一侧的前100个节点与另一侧的所有N个节点之间的匹配数。