图论知识记录

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;
}

独立集:点形成的子集,这些点没有公共边

:点形成的子集,这些点两两有连边

覆盖:点形成的子集,每条边至少有一个端点入选

支配集:点形成的子集,每个点至少有一条边与集合相连或者在集合中

以上是关于图论知识记录的主要内容,如果未能解决你的问题,请参考以下文章

图论基础知识总结

四月学习知识点列表记录

android小知识点代码片段

图论一笔画问题代码基本框架

图论基础知识.

MT90图论基础知识及相关例题