有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
你能解释一下吗?那将非常有用。
答案 0 :(得分:0)
来自wikipedia:
通过找到最大匹配并贪婪地扩展它以便覆盖所有顶点,可以在多项式时间内找到最小边缘覆盖
此问题要求您找到覆盖所有顶点的最小边数。这等于最大匹配(匹配)中的边数加上需要在贪婪扩展中添加的附加边数。
最大匹配覆盖2 *匹配顶点,这意味着必须有x =(Right.size()+ Left.size() - 2 *匹配)顶点仍未被覆盖。
因此我们需要在贪婪的扩展过程中添加x个额外的边,并且边的总数匹配+ x。