二分图匹配(匈牙利算法)
作用
求二分图中最大匹配,\(O(n\times(n+m))\)。
代码
inline bool dfs(int u){
for(int v:G[u]){
if(!vis[v]){
vis[v]=1;
if(!link[v]||dfs(link[v])) return link[v]=u,1;
}
}
return 0;
}
for(int i=1;i<=n;++i){
memset(vis,0,sizeof vis);
dfs(i);
}
细节
-
主函数
for循环只枚举左部。 -
dfs中 \(u\) 只涉及左部,\(v\) 只涉及右部,故左右可以有相同下标。 -
匈牙利算法总是尽可能让新来的被连接,所以最小字典序可以从大到小枚举。
建模
关注谁与谁匹配。
扩展
二分图最小点覆盖(等于最大匹配)
二分图最大独立集(等于 \(\text{点数} - \text{最大匹配}\) )
最大团(补图是二分图)(等于补图最大独立集)
DAG最小链划分(无重复点)(等于拆点最大匹配)
DAG最小链覆盖(floyd传递闭包转为划分)

浙公网安备 33010602011771号