Bipartite匹配找到最大覆盖率

时间:2016-05-04 09:16:31

标签: algorithm graph

Google Code Jam Problem。我发现使用Bipartite匹配解决了问题。但我无法理解如何使用匹配数得到最终答案 这是sudo代码

int match=0;
// Right - Right one String
// Left  - Left one String
for(int i=0;i<Right.size();i++)
match+=match_found(i)

最后为什么这两行代码

int need = match + (Right.size() + Left.size() - match * 2);
int answer = n- need;

为什么不应该是answer = n-match

你能解释一下吗?那将非常有用。

1 个答案:

答案 0 :(得分:0)

来自wikipedia

  

通过找到最大匹配并贪婪地扩展它以便覆盖所有顶点,可以在多项式时间内找到最小边缘覆盖

此问题要求您找到覆盖所有顶点的最小边数。这等于最大匹配(匹配)中的边数加上需要在贪婪扩展中添加的附加边数。

最大匹配覆盖2 *匹配顶点,这意味着必须有x =(Right.size()+ Left.size() - 2 *匹配)顶点仍未被覆盖。

因此我们需要在贪婪的扩展过程中添加x个额外的边,并且边的总数匹配+ x。