二分图带权最大匹配 - 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\) 就是最大匹配。

所以可以设计一个算法的大概流程:

  1. 随便找一个可行顶标方案 \(L\)

  2. 求出 \(G'\)\(G'\) 的最大匹配,若最大匹配数为 \(n\),结束;

  3. 调整一些 \(l_i\),使得 \(G'\) 变大;

  4. 重复步骤 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}\) 的最小值。

posted @ 2024-03-24 10:10  FLY_lai  阅读(28)  评论(0编辑  收藏  举报