二分图带权最大匹配 - KM 算法
KM 算法用来处理最大权完美匹配。
【定义】
-
记 \(G\) 的左部点为 \(x_i\),右部点为 \(y_i\)。
-
顶标:我们给每个结点一个整数标号 \(l_i\)。
-
可行顶标:如果对于 \(\forall (x_i,y_i)\),\(l_{x_i}+l_{y_i}-w_{x_i,y_i}\ge 0\)。
-
相等子图:定义 \(G'\) 为 \(G\) 的相等子图,\(\forall (x_i,y_i)\in G|l_{x_i}+l_{y_i}=w_{x_i,y_i}\)。
【过程】
引理:如果 \(G'\) 的最大匹配数量为 \(n\),此时 \(\sum l_i\) 就是最大匹配。
所以可以设计一个算法的大概流程:
-
随便找一个可行顶标方案 \(L\);
-
求出 \(G'\) 和 \(G'\) 的最大匹配,若最大匹配数为 \(n\),结束;
-
调整一些 \(l_i\),使得 \(G'\) 变大;
-
重复步骤 2,3,直到退出。
关键点在于步骤 3 怎么调整。
在步骤 2 求最大匹配的时候,额外把 \(G'\) 划分成四个部分:\(S_x,S_y\)(能被交错路径到达的),\(T_x,T_y\)(不能被交错路径到达的)
令 \(a=\displaystyle\min_{i\in S_x,j\in T_y}\{lab_i+lab_j-w_{i,j}\}\),然后 \(lab_i|i\in S_x-\!\!=a\),\(lab_i|i\in S_y+\!\!=a\),可以发现这么做之后,\(S_x,T_y\) 之间至少一条边会加入 \(G'\)。
而当 \(T_y=\emptyset\) 时,一定能找到增广路,找到增广路则最大匹配 \(+1\)。最大匹配最多增加 \(n\) 次。(匹配数 \(\le n\))所以循环最多 \(O(n^2)\) 次。求 \(a\) 如果枚举 \(i,j\),是 \(O(n^2)\) 的。整个算法复杂度是 \(O(n^4)\)。
算法的瓶颈在于求 \(a\) 要枚举一遍 \(i,j\)。如果我们能快速维护 \(a\) 的值就好了。
对每一个 \(y_i\) 维护一个 \(dif_y\),表示 \(l_x+l_y-w_{i,j}\) 的最小值。