经典图论简单构造
经典图论简单构造
二分图最大匹配
最基础的内容,使用匈牙利算法 \(O(nm)\),使用流 \(O(m\sqrt n)\)
二分图最小点覆盖
有最小点覆盖数等于最大匹配数
考虑先求出一组最大匹配
从二分图的左部的所有未匹配点开始 DFS(暂时不考虑没有未匹配点)
从左部到右部只能走非匹配边,从右部到左部只能走匹配边
做完 DFS 后所有未被遍历的左部点和被遍历的右部点共同构成的集合即为最小点覆盖
证明:
点集大小为最大匹配数
考虑所有左部的非匹配点都作为 DFS 的起点被遍历,未被遍历的左部点只有可能是匹配点
考虑所有被遍历的右部点一定是匹配点,若遍历到了非匹配点,那么形成了一条增广路,不符合最大匹配的性质
如果右边的某个匹配点未被遍历,则其对应的左部匹配点一定未被遍历,该左部点会放入点集中
如果左边的某个匹配点被遍历,则其对应的右部匹配点也被遍历,右部点将被放入集合
故集合中不存在非匹配点且每组匹配放且仅放一个点
点集可以覆盖所有的边
将每条边按左右端点是否被遍历到分成 4 类,容易发现仅在出现一条边左部点被遍历且右部点未被遍历时才有可能没被覆盖到
而这类边是不存在的,这是因为所有被遍历到的左部点其相邻的右部点一定都被遍历到
左部中没有未匹配点也没关系,这样子我们取出来的集合就是全部的左部点,显然同样合法
二分图最大点独立集
最大点独立集的构造考虑取最小点覆盖的补集即可
即取出被遍历的左部点和未被遍历的右部点即可
DAG 的最小不可重链覆盖
对于每个原图中的点建立一个入点,一个出点,形成一个二分图
对于每一条原图的边 \((u,v)\),在新图中连接 \((u_{out},v_{in})\)
直接跑二分图最大匹配,每一条匹配边相当于合并两条链
最小不可重链数即为原图总点数-新图最大匹配
DAG 的最小可重链覆盖
考虑对 DAG 求出传递闭包后跑最小不可重链覆盖即可
传递闭包的最优复杂度大概还只能做到 \(O(\dfrac{nm}{\omega})\)
求出来的路径中两两相邻的点随便找一条路径就是方案了
DAG 最长反链
即将 DAG 视做偏序集,选取最多的点使得两两不可比(互相不可达)
由 Dilworth 定理,最长反链大小等于偏序集最小不可重链覆盖数,即为 DAG 的最小可重链覆盖数
考虑使用 DAG 的最小可重链覆盖先跑出新二分图的最大匹配
我们只要取出 \(x_{in},x_{out}\) 都在新二分图最大独立集里的点 \(x\) 即可,记该集合为 \(A\),它们构成一个最大反链
证明:
记最大独立集为 \(I\),最大匹配为 \(S\),记最大匹配数为 \(m\)
首先证明 \(A\) 确实为一个反链,考虑其中的任意两个元素 \(u,v\)
若 \(u,v\) 存在可达关系,不妨设 \(u\to v\),由于我们的图跑了传递闭包,那么有边 \((u_{out},v_{in})\),但是最大独立集中 \(u_{in},u_{out},v_{in},v_{out}\) 均存在,矛盾
接着证明 \(|A|\geq n-m\) 即可,\(n-m\) 为 DAG 的最小可重链覆盖数
有 \(|I|=2n-|S|=2n-m\),而 \(|I|-|A|\) 可以视作「\(x_{in}\) 或者 \(x_{out}\) 在 \(I\) 中的点个数」
显然 \(|I|-|A|\leq n\),则 \(|A|\geq |I|-n=n-m\)