前言
今天模拟赛T1二分图匹配板子题,但是我不会,于是就全场就我没AT1系列了,赶紧补坑
算法
主要了解两个概念”交替路”,”增广路”.我们所做的就是不断找增广路.图我太懒不想画…推荐一个我认为写的很好的一篇博客,我就是在这学的
https://www.renfei.org/blog/bipartite-matching.html
定理
最小点覆盖数等于二分图最大匹配数
证明见Matrix67大神Blog:http://www.matrix67.com/blog/archives/116
最大独立集点数数(点集不包含任何一条边)等于总点数减去二分图最大匹配数
DAG上的最小不相交路径覆盖(找出最少的经过顶点各不同的路径覆盖整个图)数等于点数减去最大匹配数
这些还是比较有用的
代码
BFS版本
1 |
|
注意几点:
我们找到一条增广路后要及时特判退出
用tmp记录s的另一个匹配
- 一开始起点pre赋为-1
例(水)题:
JZOJ5934 phalanx
经典模型,行为左边的点集,列为右边的,对于不能染两次的行列连边,容易发现连了边的点一起选是非法的,我们要找的就是选出最多的点集使得没有一条边,转化成最大独立集来做
代码:
1 |
|
JZOJ1922 小行星
像上题一样对于小行星所在行列连边,发现任何一条边的左右端点至少选一个,转化成最小点覆盖就好了
代码:
1 |
|