*【学习笔记】(17) 二分图

定义

有两个点集合(\(A,B\),且 \(A ∩ B=\) Ø),对于任意一个点,没有一条边能够到达与它同集的点。称 \(A,B\) 为二分图的左部和右部。

性质

图中不存在长度为奇数的环
染色法过程中不存在矛盾

证明

根据染色法,要不存在矛盾,肯定要 白黑 白黑 …… 白黑,如果要构成环,路径中第一个点与最后一个点颜色不同,此时环长必定为偶数。

所以长度为奇数的环必定能使染色法矛盾,而染色法每次不同的颜色不相当于是A,B集合中的点交替出现吗?

证毕

所以,我们可以用染色法来判定无向图是不是二分图。

应用

二分图最大匹配

“任意两条边都没有公共端点”的边的集合被称为图的一组 匹配,在二分图中,包含边数最多的一组匹配被称为二分图的 最大匹配。

对于选中的边称为 匹配边,而匹配边两端的点称为 匹配点,相反,没有选中的边称为 非匹配边,不是 匹配点 的点称为 非匹配点。

增广路

如果在二分图中,一条路径 path 中存在一条连接两条 非匹配点 的路径,使得 匹配边 和 非匹配边 在 path 上交错出现,那么就称 path 为 增广路。

显然,path 具有以下性质:

  1. 长度len为奇数。

  2. path 上第1,3,5,...,len 条边是 非匹配边,相反,剩下的第2,4,...,len-1 条边是 匹配边,即 非匹配边数 = 匹配边数 +1。

所以,我们可以得出,对于一组匹配 S 是最大匹配,仅当途中不存在 S 的 增广路。因为,当我们把增广路 path 上的 匹配边 与 非匹配边 取反,能使匹配边数 +1。

匈牙利算法(增广路算法)

用于计算二分图中的最大匹配,主要过程:

  1. 设 S=Ø ,即初始所有的边都为 非匹配边。

  2. 寻找 增广路 path ,把 path 上的所有状态取反,得到一个更大的匹配 S'。

  3. 重复步骤2,直至图中不存在 增广路。

在寻找 增广路 的过程中,我们尝试给每一个左部节点 x 寻找一个右部节点 y。y需要满足以下条件

  1. y 是 非匹配点。

  2. 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++;
    }
}

对于每个左部节点,寻找增广路最多只要遍历整张二分图一次,时间复杂度 \(O(NM)\)

构建二分图匹配的模型

构建二分图匹配的模型需要以下两个要素:

1.节点能分成独立的两个集合,每个集合内部有0条边。

2.每个节点只能与1条匹配边相连。

完备匹配

如果一张二分图 左部和右部节点数均为N,且最大匹配包含 N 条匹配边,则称该二分图具有完备匹配。

多重匹配

二分图带权匹配

二分图最小点覆盖

给定一张二分图,求出一个最小点集 S,使得图中任意一条边都至少有有一个端点 存在S中。这个问题了称作二分图最小点覆盖。

König 定理

  二分图最小点覆盖的点数包含的点数等于二分图最大匹配包含的边数。

证明

二分图最大独立集

给定一张无向图 \(G=(V,E)\)\(V\)为点集,\(E\)为边集,满足下列条件的点集 \(S\) 被称作图的独立集:

  1. \(S ⊆ V\) (即点集 \(S\) 里的点都存在点集 \(V\) 中,可能是句废话)

  2. \(∀ x,y ∈ S, (x,y) ∉ E\) (即点集 \(S\) 中任意两点都不存在边)

S 中包含点数最多的就是图的最大独立集。

对应地,“任意两点之间都有一条边相连”的子图被称为无向图的 “团” ,点数最多的 团 被称为图的最大团。

定理1:

无向图 \(G\) 的最大团等于其补图 \(G'\) 的最大独立集。

(注: \(G'=(V,E')\) 被称为 \(G=(V,E)\) 的补图,其中 \(E'={(x,y)∉ E}\), 即\(G\)有的边,\(G'\)没有,\(G\)没有的边,\(G'\)有)

易证,证明略

定理2:

\(G\) 时有 \(n\) 个节点的二分图,\(G\) 的最大独立集的大小等于 \(n\) 减去最大匹配数。

证明:

  选出最多的点构成独立集

  等价于 在图中去掉最少的点,是剩下的点之间没有边

  等价于 用最少点覆盖所有的边

  因此,去掉二分图的最小点覆盖,剩余的点就构成二分图的最大独立集。而最小点覆盖数等于最大匹配数,所以,n-最大匹配数=最大独立集大小

证毕

有向无环图的最小路径点覆盖

给定一张有向无环图,要求用尽量少的不相交简单路径,覆盖有向无环图的所有顶点(即每个顶点恰好被覆盖一次)。这个问题叫做 有向无环图 的最小路径点覆盖问题。

设原来的有向无环图为 $G=(V,E),n=|V| $( $|V| $ 表示点集V的大小),把 \(G\) 中的每个点拆成编号为 \(x\)\(x+n\) 的两个点。建立一张二分图,\(1\sim n\) 作为左部点,\(n+1\sim 2n\) 作为右部点。对于原图的每条有向边 \((x,y)\),在二分图的左部点 \(x\) 与二分图的右部点 \(y+n\) 之间连边。最终得到的二分图称为 \(G\) 的拆点二分图,记为 \(G_2\)

定理

有向无环图 \(G\) 的最小路径点覆盖包含的路径条数,等于 \(n\) 减去拆去二分图 \(G_2\) 的最大匹配数。

证明:

在有向无环图 \(G=(V,E)\) 的最小路径覆盖中,对于任意的 \(x∈V\),因为路径不相交,所以 \(x\)的入度和出度都不超过 \(1\)。且因为每个节点都被覆盖,所以入度和出度至少有一个是\(1\)

因此,最小路径覆盖中的所有边,在拆点二分图 \(G_2\) 中构成一组匹配。最小路径覆盖中的每条边 \((x,y)\) 的起点 \(x\) 与二分图每条匹配边的左部点 \(x\) 是一一对应的。

特别地,对于每条路径的终点 \(t\) ,因为 \(t\) 没有出边,所以在二分图中,\(t\) 匹配失败。及路径的终点和二分图左部的非匹配点是一一对应的。

路径覆盖包含的路径条数最少

等价于 路径的终点数(出度为 \(0\) 的点数)最少

等价于 二分图左部非匹配点最少

\(G\) 的最小路径覆盖的路径数等于 \(n\) 减去拆点二分图 \(G_2\) 的最大匹配数。

证毕

最小路径可重复点覆盖

给定一张有向无环图,要求用尽量少的可相交的简单路径,覆盖有向无环图的所有顶点(即一个点可以覆盖多次)。这个问题被称为最小路径可重复点覆盖。

在最小路径可重复点覆盖中,若两条路径 \(...->u->p->v...\)\(...x->p->y...\) 在点 \(p\) 相交,则我们在原图中添加一条边 \((x,y)\),让第二条路径直接走 \(x->y\) ,就可以避免重复覆盖点 \(p\)

进一步地,如果我们把原图中所有间接联通的点直接连上有向边,那么任何 “有路径相交的点覆盖” 一定能转化成 “没有路径相交的点覆盖”。

综上所述,有向无环图 \(G\) 的最小路径可重复点覆盖,等价于先对有向图传递闭包,得到有向无环图 \(G'\) ,再在 \(G'\) 上求一般的(路径不可相交)最小路径点覆盖。

posted @ 2022-03-04 18:04  Aurora-JC  阅读(119)  评论(0编辑  收藏  举报