图论知识记录
Posted reverymoon
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了图论知识记录相关的知识,希望对你有一定的参考价值。
二分图相关
二分图,两个等价定义:没有奇环的图 / 可以黑白染色的图
证明:
充分性证明:如果一张图没有奇环,那么它可以黑白染色
考虑反证,如果它不能黑白染色,那么存在奇环
一定存在一条边((u, v)),使得(u, v)同时为白色
((u, v))一定在环中,如果不在,考虑(dfs)构造,那么((u, v))不可能是同一颜色
如果((u, v))所在环是一个偶环,那么取反(u)后,原图合法,不符合无法染色的条件
因此,((u, v))所在环一定是一个奇环
必要性证明:如果一张图可以黑白染色,那么它没有奇环
考虑逆否命题,如果它有奇环,那么它一定不能黑白染色
单独考虑这个奇环,设其中一点颜色为白,那么绕着奇环走一圈,会经过奇数条边回到它自身,此时它必须是黑色才能满足条件
这不可能,因此必要性成立
匹配:边形成的子集,这些边没有公共顶点
匈牙利算法
在匹配中的边称为匹配边,其余边称为非匹配边
和匹配边相邻匹配点,否则称为非匹配点
交错路:匹配边和非匹配边彼此相间的道路
增广路:两端都为非匹配点的交错路
取反交错路后,匹配数不会变少
取反增广路后,匹配数会 + 1
增广路引理:如果从一个未匹配点出发找不到增广路,那么存在一个最大匹配,这个最大匹配不包含这个点
(某大佬说它需要一个名字
证明:
考虑构造一个匹配(M),这个(M)中存在一个未匹配点(u),(u)没有增广路
假设这张图的一个最大匹配为(M')
那么,如果(u)不在(M')中,那么得证
如果(u)在(M')中是匹配点,那么设(u)的匹配点为(v)
考虑(v),如果(v)的出边中有一条连向非匹配点,那么取反这条交错路,得证
否则,因为(u)在(M)中没有增广路,因此(v)在(M)中有匹配点(u'),且(u')在(M')中也是匹配点
考虑(u'),如果(u')的出边中有非匹配点,那么存在增广路,(M)不是最大匹配
否则,考虑(u')在(M')中的匹配点(v').....
依次类推
如果没有在中间找到一条交错路
由于(u)不存在增广路,因此最终停止的节点一定和(u)属于同一部分,记做(u_1)
但是在(M')中,(u)到(u_1)形成了一条增广路,这不可能
因此,一定会在中间的过程中找到一条交错路,使得交错之后的最大匹配(M_1)不含(u)
增广路定理:如果图上不存在增广路,当且仅当匹配为最大匹配
证明:
必要性证明:如果原图为最大匹配,那么图上不存在增广路
如果有增广路,那么匹配可以+1,不符合最大匹配
充分性证明:如果图上不存在增广路,那么原图为最大匹配
对于所有的未匹配点而言,都找不到增广路,对它们依次使用增广路引理
最终,剩下的点只含匹配点,且根据增广路引理,它是最大匹配
算法
根据增广路引理,我们知道:
如果从一个点出发找不到增广路,那么删除它仍然有最大匹配
因此,我们可以考虑对每个点依次尝试寻找增广路,如果一个点找到了增广路,那么最大匹配+1
bool dfs(int o) {
for(int i = cap[o]; i; i = nxt[i]) {
int cur = node[i];
if(!vis[cur]) {
vis[cur] = 1;
if(!mat[cur] || dfs(mst[cur]))
{ mat[cur] = o; return 1; }
}
}
return 0;
}
int Match() {
int ret = 0;
for(int i = 1; i <= n; i ++)
ret += dfs(i);
return ret;
}
独立集:点形成的子集,这些点没有公共边
团:点形成的子集,这些点两两有连边
覆盖:点形成的子集,每条边至少有一个端点入选
支配集:点形成的子集,每个点至少有一条边与集合相连或者在集合中
以上是关于图论知识记录的主要内容,如果未能解决你的问题,请参考以下文章