经典图论简单构造

经典图论简单构造

二分图最大匹配

最基础的内容,使用匈牙利算法 O(nm),使用流 O(mn)

二分图最小点覆盖

有最小点覆盖数等于最大匹配数

考虑先求出一组最大匹配

从二分图的左部的所有未匹配点开始 DFS(暂时不考虑没有未匹配点)

从左部到右部只能走非匹配边,从右部到左部只能走匹配边

做完 DFS 后所有未被遍历的左部点被遍历的右部点共同构成的集合即为最小点覆盖

证明:

  1. 点集大小为最大匹配数

    考虑所有左部的非匹配点都作为 DFS 的起点被遍历,未被遍历的左部点只有可能是匹配点

    考虑所有被遍历的右部点一定是匹配点,若遍历到了非匹配点,那么形成了一条增广路,不符合最大匹配的性质

    如果右边的某个匹配点未被遍历,则其对应的左部匹配点一定未被遍历,该左部点会放入点集中

    如果左边的某个匹配点被遍历,则其对应的右部匹配点也被遍历,右部点将被放入集合

    故集合中不存在非匹配点且每组匹配放且仅放一个点

  2. 点集可以覆盖所有的边

    将每条边按左右端点是否被遍历到分成 4 类,容易发现仅在出现一条边左部点被遍历且右部点未被遍历时才有可能没被覆盖到

    而这类边是不存在的,这是因为所有被遍历到的左部点其相邻的右部点一定都被遍历到

左部中没有未匹配点也没关系,这样子我们取出来的集合就是全部的左部点,显然同样合法

二分图最大点独立集

最大点独立集的构造考虑取最小点覆盖的补集即可

即取出被遍历的左部点未被遍历的右部点即可

DAG 的最小不可重链覆盖

对于每个原图中的点建立一个入点,一个出点,形成一个二分图

对于每一条原图的边 (u,v),在新图中连接 (uout,vin)

直接跑二分图最大匹配,每一条匹配边相当于合并两条链

最小不可重链数即为原图总点数-新图最大匹配

DAG 的最小可重链覆盖

考虑对 DAG 求出传递闭包后跑最小不可重链覆盖即可

传递闭包的最优复杂度大概还只能做到 O(nmω)

求出来的路径中两两相邻的点随便找一条路径就是方案了

DAG 最长反链

即将 DAG 视做偏序集,选取最多的点使得两两不可比(互相不可达)

由 Dilworth 定理,最长反链大小等于偏序集最小不可重链覆盖数,即为 DAG 的最小可重链覆盖数

考虑使用 DAG 的最小可重链覆盖先跑出新二分图的最大匹配

我们只要取出 xin,xout 都在新二分图最大独立集里的点 x 即可,记该集合为 A,它们构成一个最大反链

证明:

记最大独立集为 I,最大匹配为 S,记最大匹配数为 m

首先证明 A 确实为一个反链,考虑其中的任意两个元素 u,v

u,v 存在可达关系,不妨设 uv,由于我们的图跑了传递闭包,那么有边 (uout,vin),但是最大独立集中 uin,uout,vin,vout 均存在,矛盾

接着证明 |A|nm 即可,nm 为 DAG 的最小可重链覆盖数

|I|=2n|S|=2nm,而 |I||A| 可以视作「xin 或者 xoutI 中的点个数」

显然 |I||A|n,则 |A||I|n=nm

posted @   juju527  阅读(123)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示