二分图

定义:

二分图又称作二部图,是图论中的一种特殊模型。 设G=(V,E)是一个无向图,如果顶点V可分割为两个互不相交的子集(A,B),并且图中的每条边(i,j)所关联的两个顶点i和j分别属于这两个不同的顶点集(i in A,j in B),则称图G为一个二分图。
简而言之,就是顶点集V可分割为两个互不相交的子集,并且图中每条边依附的两个顶点都分属于这两个互不相交的子集,两个子集内的顶点不相邻。——百度百科

也就是可以像变成这个样子的图:
image

最大匹配:

定义

  1. 匹配:
    给定一个边集 \(S\) ,若 \(S\) 中任意两条边都没有公共端点,就称 \(S\) 是这个图的一个匹配。
    image
    图中所有的红色边就是其一个匹配。
  2. 最大匹配:
    指所有匹配中边数最多的一个匹配。
  3. 交错路:
    指一条路径,其中的每一条边交替地属于或不属于匹配。
    上图中, \(6 \rightarrow 2 \rightarrow 8\) 就是一条交错路。
  4. 增广路:
    对于一条交错路,若它的起始顶点与终点都不在匹配中,则称它为增广路。
    上图中, \(1 \rightarrow 7 \rightarrow 5 \rightarrow 10\) 就是一条增广路路。
    如果将一条增广路取反,其匹配数加一。
    在一个最大匹配中,不存在增广路。

做法

直接看图吧。
image
然后一直对左边的点这样钦定,当钦定到点 \(4\) 时,发现没有没匹配过的右边点与其匹配。
image
最后结果:
image
正确性显然,相当于在不断找增广路并将其取反。
复杂度:\(\Theta(nm)\)

COED
bool match(int x){
	if(vis[x]) return false;
	vis[x]=1;
	For_to(i,x){
		int y=to[i];
		if(!ism[y]||match(ism[y])){ism[y]=x;return true;}
	}
	return false;
}

//主函数

for(int i=1;i<=n;i++){
	memset(vis,0,sizeof vis);
	if(match(i)) ans++;
}

好像还有网络流做法可以更优,什么时候会了在更吧。

最小顶点覆盖

定义

定义一条边被覆盖当且仅当至少选中一个这条边的端点,最小顶点覆盖就是选中最少的点来覆盖所有的边

做法

定理:最小顶点覆盖等于最大匹配数。

可以感性理解一下。

最大独立集

定义

  1. 独立集:
    若有一个点集其中所有的点两两之间没有边相连,则称这个点集为一个独立集。
  2. 最大独立集:
    所有独立集中点数最多的一个称之为最大独立集。

做法

定理:最大独立集 \(=\) 所有顶点数 \(-\) 最小顶点覆盖。

考虑最小顶点覆盖已经覆盖了所有的边,所以剩下的点之间一定不会有边相连。
并且最小顶点覆盖已经是最小的了,所以不会有更优的情况。

最大团

定义

就是选出一个最大的集合,是这个集合中所有点两两之间有边相连。

注意区分最大比配和最大团,最大团没有要求一对一。

做法

直接建反图,求反图最大独立集即可。

posted @ 2023-03-12 07:54  xrlong  阅读(33)  评论(1编辑  收藏  举报