二分图
定义:
二分图又称作二部图,是图论中的一种特殊模型。 设G=(V,E)是一个无向图,如果顶点V可分割为两个互不相交的子集(A,B),并且图中的每条边(i,j)所关联的两个顶点i和j分别属于这两个不同的顶点集(i in A,j in B),则称图G为一个二分图。
简而言之,就是顶点集V可分割为两个互不相交的子集,并且图中每条边依附的两个顶点都分属于这两个互不相交的子集,两个子集内的顶点不相邻。——百度百科
也就是可以像变成这个样子的图:
最大匹配:
定义
- 匹配:
给定一个边集 \(S\) ,若 \(S\) 中任意两条边都没有公共端点,就称 \(S\) 是这个图的一个匹配。
图中所有的红色边就是其一个匹配。 - 最大匹配:
指所有匹配中边数最多的一个匹配。 - 交错路:
指一条路径,其中的每一条边交替地属于或不属于匹配。
上图中, \(6 \rightarrow 2 \rightarrow 8\) 就是一条交错路。 - 增广路:
对于一条交错路,若它的起始顶点与终点都不在匹配中,则称它为增广路。
上图中, \(1 \rightarrow 7 \rightarrow 5 \rightarrow 10\) 就是一条增广路路。
如果将一条增广路取反,其匹配数加一。
在一个最大匹配中,不存在增广路。
做法
直接看图吧。
然后一直对左边的点这样钦定,当钦定到点 \(4\) 时,发现没有没匹配过的右边点与其匹配。
最后结果:
正确性显然,相当于在不断找增广路并将其取反。
复杂度:\(\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++;
}
好像还有网络流做法可以更优,什么时候会了在更吧。
最小顶点覆盖
定义
定义一条边被覆盖当且仅当至少选中一个这条边的端点,最小顶点覆盖就是选中最少的点来覆盖所有的边
做法
定理:最小顶点覆盖等于最大匹配数。
可以感性理解一下。
最大独立集
定义
- 独立集:
若有一个点集其中所有的点两两之间没有边相连,则称这个点集为一个独立集。 - 最大独立集:
所有独立集中点数最多的一个称之为最大独立集。
做法
定理:最大独立集 \(=\) 所有顶点数 \(-\) 最小顶点覆盖。
考虑最小顶点覆盖已经覆盖了所有的边,所以剩下的点之间一定不会有边相连。
并且最小顶点覆盖已经是最小的了,所以不会有更优的情况。
最大团
定义
就是选出一个最大的集合,是这个集合中所有点两两之间有边相连。
注意区分最大比配和最大团,最大团没有要求一对一。
做法
直接建反图,求反图最大独立集即可。
本文来自博客园,作者:xrlong,转载请注明原文链接:https://www.cnblogs.com/xrlong/articles/17133482.html
版权声明:本作品采用 「署名-非商业性使用-相同方式共享 4.0 国际」许可协议(CC BY-NC-SA 4.0) 进行许可。