*【学习笔记】(17) 二分图
定义
有两个点集合(
性质
图中不存在长度为奇数的环
染色法过程中不存在矛盾
证明
根据染色法,要不存在矛盾,肯定要 白黑 白黑 …… 白黑,如果要构成环,路径中第一个点与最后一个点颜色不同,此时环长必定为偶数。
所以长度为奇数的环必定能使染色法矛盾,而染色法每次不同的颜色不相当于是A,B集合中的点交替出现吗?
证毕
所以,我们可以用染色法来判定无向图是不是二分图。
应用
二分图最大匹配
“任意两条边都没有公共端点”的边的集合被称为图的一组 匹配,在二分图中,包含边数最多的一组匹配被称为二分图的 最大匹配。
对于选中的边称为 匹配边,而匹配边两端的点称为 匹配点,相反,没有选中的边称为 非匹配边,不是 匹配点 的点称为 非匹配点。
增广路
如果在二分图中,一条路径 path 中存在一条连接两条 非匹配点 的路径,使得 匹配边 和 非匹配边 在 path 上交错出现,那么就称 path 为 增广路。
显然,path 具有以下性质:
-
长度len为奇数。
-
path 上第1,3,5,...,len 条边是 非匹配边,相反,剩下的第2,4,...,len-1 条边是 匹配边,即 非匹配边数 = 匹配边数 +1。
所以,我们可以得出,对于一组匹配 S 是最大匹配,仅当途中不存在 S 的 增广路。因为,当我们把增广路 path 上的 匹配边 与 非匹配边 取反,能使匹配边数 +1。
匈牙利算法(增广路算法)
用于计算二分图中的最大匹配,主要过程:
-
设 S=Ø ,即初始所有的边都为 非匹配边。
-
寻找 增广路 path ,把 path 上的所有状态取反,得到一个更大的匹配 S'。
-
重复步骤2,直至图中不存在 增广路。
在寻找 增广路 的过程中,我们尝试给每一个左部节点 x 寻找一个右部节点 y。y需要满足以下条件
-
y 是 非匹配点。
-
y 与左部点 x' 匹配,但从 x' 出发能找到另一个右部点 y' 与之匹配(此时,x->y->x'->y' 构成一条增广路)。
匈牙利算法的正确性基于贪心策略,就是当一个节点成为 匹配点 时,它至多会因为找到 增广路 而更换匹配对象,而不会再变回非匹配点。
实现方法如下:
bool dfs(int x){ for(int i=Head[x];i;i=Next[i]){ int y=to[i]; if(vis[y]) continue; vis[y]=1; if(!match[y]||dfs(match[y])){ match[y]=x; return true; } } return false; } int mian(){ for(int i=1;i<=n;i++){ //枚举每一个左部点 memset(vis,0,sizeof(vis)); if(dfs(i)) ans++; } }
对于每个左部节点,寻找增广路最多只要遍历整张二分图一次,时间复杂度
构建二分图匹配的模型
构建二分图匹配的模型需要以下两个要素:
1.节点能分成独立的两个集合,每个集合内部有0条边。
2.每个节点只能与1条匹配边相连。
完备匹配
如果一张二分图 左部和右部节点数均为N,且最大匹配包含 N 条匹配边,则称该二分图具有完备匹配。
多重匹配
二分图带权匹配
二分图最小点覆盖
给定一张二分图,求出一个最小点集 S,使得图中任意一条边都至少有有一个端点 存在S中。这个问题了称作二分图最小点覆盖。
König 定理
二分图最小点覆盖的点数包含的点数等于二分图最大匹配包含的边数。
证明
二分图最大独立集
给定一张无向图
-
(即点集 里的点都存在点集 中,可能是句废话) -
(即点集 中任意两点都不存在边)
S 中包含点数最多的就是图的最大独立集。
对应地,“任意两点之间都有一条边相连”的子图被称为无向图的 “团” ,点数最多的 团 被称为图的最大团。
定理1:
无向图
(注:
易证,证明略
定理2:
设
证明:
选出最多的点构成独立集
等价于 在图中去掉最少的点,是剩下的点之间没有边
等价于 用最少点覆盖所有的边
因此,去掉二分图的最小点覆盖,剩余的点就构成二分图的最大独立集。而最小点覆盖数等于最大匹配数,所以,n-最大匹配数=最大独立集大小
证毕
有向无环图的最小路径点覆盖
给定一张有向无环图,要求用尽量少的不相交简单路径,覆盖有向无环图的所有顶点(即每个顶点恰好被覆盖一次)。这个问题叫做 有向无环图 的最小路径点覆盖问题。
设原来的有向无环图为
定理
有向无环图
证明:
在有向无环图
因此,最小路径覆盖中的所有边,在拆点二分图
特别地,对于每条路径的终点
路径覆盖包含的路径条数最少
等价于 路径的终点数(出度为
等价于 二分图左部非匹配点最少
故
证毕
最小路径可重复点覆盖
给定一张有向无环图,要求用尽量少的可相交的简单路径,覆盖有向无环图的所有顶点(即一个点可以覆盖多次)。这个问题被称为最小路径可重复点覆盖。
在最小路径可重复点覆盖中,若两条路径
进一步地,如果我们把原图中所有间接联通的点直接连上有向边,那么任何 “有路径相交的点覆盖” 一定能转化成 “没有路径相交的点覆盖”。
综上所述,有向无环图
本文作者:南风未起
本文链接:https://www.cnblogs.com/jiangchen4122/p/15965527.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步