二分图

定义

节点由两个集合组成,且两个集合内部没有边的图。

二分图不存在长度为奇数的环。

\(\because\) 每一条边都是从一个集合走到另一个集合,只有走偶数次才可能回到同一个集合。

\(\therefore\) 二分图不存在长度为奇数的环。

判定

需知是否可以将图中的顶点分成两个满足条件的集合。

我们可以使用 DFS 或者 BFS 来遍历这张图。如果发现了奇环,那么就不是二分图,否则是。(俗称染色法

口胡一下 >_< :就是从一个点开始染色(假设染为黑色),把与该点相连的染成另外一个颜色(假设染为白色),然后“黑 - 白 - 黑 - 白……”,若此时染到的点被染过了,如果与要染的颜色相同就继续,如果不同就直接return false。直到遍历完成。

code:

const int N=1e5+10;
int n,m,x,y,col[N],cnt,head[N];
struct node{
	int u,v,nxt;
}a[N];
void add(int u,int v){
	a[++cnt]=(node){u,v,head[u]};
	head[u]=cnt; 
}
int dfs(int x,int c){
	col[x]=c;
	for(int i=head[x];i;i=a[i].nxt){
		int v=a[i].v;
		if(!col[v]){
			if(!dfs(v,-c)) return false;
		}
		else if(col[v]==c) return false;
	}
	return true;
}
signed main(){
	n=read();m=read();
	rep(i,1,m){
		x=read();y=read();
		add(x,y);
		add(y,x);
	}
	rep(i,1,n){
		if(!col[i]){
			if(!dfs(i,1)){
				cout<<"No"<<'\n';
				return 0;
			}
		}
	}
	cout<<"Yes"<<'\n';
	return 0;
}

应用

前置:最大匹配 ,尽可能多地将\(v1\) ,\(v2\)中的点配对;最大权匹配 ,最佳匹配就是\(v1(v2)\)中所有的点都与\(v2(v1)\)中的某一个点匹配成对,并且能够使得这些边的权值之和最大的匹配。 显然,满足最大匹配的子图可能不唯一,而满足最佳匹配的子图,由于不同边可能有一样的权值,也可能不唯一。

二分图最大匹配

可用匈牙利算法,也可借助最大流/最小割模型解决。

匈牙利算法

引入

匈牙利算法是基于深度优先搜索一遍一遍搜索增广路的存在性来增加匹配对数的

我们将问题看作相亲现场,每个\(U\)集合的人排队寻找V
集合里的对象

假设是男生排队找女生,基于这个"时间"顺序,假设前面的男生已经匹配了一些

下一个男生\(a\)进来匹配,算法便会遍历一遍他认识的女生(与他有关系的\(V\)集内的点)

如果发现当前遍历到的女生还没有被其他男生匹配,那非常好,就直接把这个女生匹配给男生\(a\)

如果发现已经被其他男生\(b\)
给绿匹配了,那算法会尝试去和那个男生\(b\)沟通,询问能否让他换一个(?)

算法便会来到那个男生\(b\)那里,重新遍历一遍他认识的女生,看看能否找到其他能够匹配的女生(寻找增广路/套娃)

如果可以,那么男生\(b\)便会与新找到的女生匹配,顺利成章的,原来与男生\(b\)匹配的女生就可以和男生\(a\)匹配啦

如果不行,那么男生\(a\)就没这个机会了QAQ,尝试下一个吧(继续遍历),实在不行(遍历完了)单着挺好的

就以这样的方法一直搜索,直到所有男生(U
集)该匹配的都匹配完了,就能得到最大匹配数了

时间复杂度为 $ O(n^2m)$

优化:如果用边表存可以匹配的边优化成 \(O(n\times\)边的数量\()\)

二分图最大权匹配

二分图最大权完美匹配,表示此时的二分图的边是带有边权的。

与二分图最大匹配不同的是,最大权完美匹配侧重于最大权值,要求在保证一个点最多只能有与其有关系的一条边被选中的前提下,选出的边的边权总和最大。

可用KM算法

两个讲的很详细的博客 1 2

总结一下就是:

每个点有性质 \(val\);不同集合间边有边权\(dis\)

假设当前集合为 \(U\) , 目标集合为 \(V\)

集合 \(U\) 中点的初始 \(val\) 为最大权重(最大边权), \(V\) 中点的初始 \(val=0\)

匹配时遵循一个原则就是,所选点与目标点的 \(val\) 和等于两点间的边权 \(dis\)

如果当前点 \(x_1\) 的目标点 \(y\) 已经被匹配过,此时发生了冲突,便去找与 \(y\) 匹配的点 \(x_2\) ,让 \(x_2\) 去重新找点。

\(x_2\) 也找不到点匹配,便将 \(x_1\) , \(x_2\)\(val-1\) , y 的\(val+1\) 。继续按照原则匹配。

(我口胡的)

然后就是例题力。

posted @ 2023-06-19 19:29  XYini  阅读(0)  评论(0)    收藏  举报