最近在切二分匹配的题目,以前只学了点概念,趁现在有时间仔细得学下,下午和晚上花了几个小时学了KM算法,开始比较难理解,看了lrj的ppt后,有点明白了,现在整理下,以便记住。
概念:
lx(u),ly(v)分别表示左右两边的顶点顶标,即每一个点的值,这里有lx(u)+ly(v)>=w(u,v),选值时可令ly(v)=0,lx(u)为邻边权值最大的一个值。
相等子图:G的生成子图,仅包含满足lx(u)+ly(v)==w(u,v)的边(所以叫相等,我是这样理解的)
定理:如果相等子图有完美匹配,则该匹配是原图的最大匹配。(证明可以去搜刘汝佳的ppt)
思想:选定顶点的顶标,寻找相等子图的完美匹配,若找到,则终止算法,否则更新顶标,使更多的边满足lx(u)+ly(v)==w(u,v);循环直到算法终止。
一下是一个在网上找的代码以及个人的解析分享下(若有错误,谢谢指出):