二分图
对于判定,大概常见的有这么两种方法:
- 寻找奇环
有定理一个图是二分图的充要条件是不存在奇环
那么 \(dfs\) 黑白染色即可
- 扩展域并查集
由于一条边的两个端点必须在不同集合里,那么和扩展域对应连边即可
二分图性质
二分图有性质任意两点的所有路径奇偶性相同
那么对于路径长度相关问题往往可以利用二分图解决,其中其与生成树联系较为紧密
考虑对于一个同色连通块其实点都是等价的,那么只与路径长度有关
那么我们不妨把所有边转化为 \(00,11\) 和异色,那么对于每种边,形成的连通块如果是二分图,那么奇偶性固定,保留生成树即可,否则加一个自环使得奇偶性固定
最后边集数量为 \(O(n)\),那么跑一个 \(f[x][y]\) 为状态、向两边扩展的 \(bfs\) 即可
Hall 定理
邻域 \(N(S)\):点集 \(S\subseteq X\) 连向 \(Y\) 的点集
则二分图有完美匹配 \(\iff\forall S\subseteq X,|N(S)|\ge|S|\)
且二分图最大匹配为 \(|X|-\max_{S\subseteq X}\{|S|-|N(S)|\}\)
一般 \(Hall\) 定理的流程比较固定
如果不是状压的数据范围,那么一定首先要寻找左部点什么样的点集使得匹配条件可以取到所有最劣的条件,这一步一般会选取区间,当然要经过一些巧妙的排序
然后考虑用数据结构维护即可,常见的做法为维护 \(|S|-|N(S)|\) 的最大值即可刻画出来
可以发现这部分常常与二维数据结构联系紧密
左部点是下标,右部点是区间,考虑什么时候 \(|S|-|N(S)|\) 最大,一定是选择一个连续的区间
那么即 \(sum[l,r]-k(r-l+1+d)\) 最大
那么把 \(k(r-l+1)\) 的贡献塞进 \(sum\) 里,即加入的时候统一减一,维护出最大子段和是否小于等于定值 \(kd\) 即可
首先二分答案,仍然是每一段连续左部点(新郎)去寻找合法的右部点个数
设 \(l_i,r_i\) 表示第 \(i\) 个人可以覆盖到的范围,那么需要保证 \(i-j\ge r_i-l_j\),那么 \(i-r_i\ge j-l_j\),维护出前缀 \(max\) 即可
实现时破环成链,不用考虑一个新娘出现两次的情况,因为二分的答案保证了这一点,是 \(\le \frac{n}{2}\) 的
对于 \(b\) 一定降序排列,此时 \(a\) 将对应一个前缀
还是要找到选取 \(a\) 怎样的区间会使得匹配条件最劣
直接也升序排列,使得每个数作为最大值的时候都有尽可能多的左部点在集合中
考虑怎样来动态刻画出这件事
一个很妙的做法是用不动的 \(b\) 数组来刻画,即第 \(i\) 个位置应该被覆盖至少 \(m-i+1\) 次
用线段树动态维护即可
匈牙利算法
虽然确实大多数情况都是可以直接网络流硬上获得更优复杂度的,但是在一些特定情形下匈牙利有着不可替代的作用
一般而言,只能匈牙利的题和最优性有关,即除了最大匹配外还要求第二关键字同时最优
很明显首先可以转化为二分图匹配模型
但是题目限制要求字典序最小,使用匈牙利即可
这道题中距离就是一个第二关键字,匹配的过程中应该保证距离优先,否则会出现走不过去的情况
那么按照 \(bfs\) 的顺序寻找点进行匈牙利匹配即可