二分图带权最大匹配 - KM 算法

KM 算法用来处理最大权完美匹配。

【定义】

  • G 的左部点为 xi,右部点为 yi

  • 顶标:我们给每个结点一个整数标号 li

  • 可行顶标:如果对于 (xi,yi)lxi+lyiwxi,yi0

  • 相等子图:定义 GG 的相等子图,(xi,yi)G|lxi+lyi=wxi,yi

【过程】

引理:如果 G 的最大匹配数量为 n,此时 li 就是最大匹配。

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

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

  2. 求出 GG 的最大匹配,若最大匹配数为 n,结束;

  3. 调整一些 li,使得 G 变大;

  4. 重复步骤 2,3,直到退出。

关键点在于步骤 3 怎么调整。

在步骤 2 求最大匹配的时候,额外把 G 划分成四个部分:Sx,Sy(能被交错路径到达的),Tx,Ty(不能被交错路径到达的)

a=miniSx,jTy{labi+labjwi,j},然后 labi|iSx=alabi|iSy+=a,可以发现这么做之后,Sx,Ty 之间至少一条边会加入 G

而当 Ty= 时,一定能找到增广路,找到增广路则最大匹配 +1。最大匹配最多增加 n 次。(匹配数 n)所以循环最多 O(n2) 次。求 a 如果枚举 i,j,是 O(n2) 的。整个算法复杂度是 O(n4)

算法的瓶颈在于求 a 要枚举一遍 i,j。如果我们能快速维护 a 的值就好了。

对每一个 yi 维护一个 dify,表示 lx+lywi,j 的最小值。

posted @   FLY_lai  阅读(87)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
点击右上角即可分享
微信分享提示