二分图匹配(匈牙利算法)

作用

求二分图中最大匹配,\(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传递闭包转为划分)

posted @ 2023-11-12 12:54  mRXxy0o0  阅读(21)  评论(0)    收藏  举报