二分图相关技术

Bipartite Graph.

无特殊说明时,n为点数,m为边数。

基础部分

定义和判定

点集可以分成两个集合,任意一个集合内部没有边。

性质:没有奇环。这是充要条件。用这个来O(n+m)来判定二分图。

二分图最大匹配

P3386 【模板】二分图最大匹配

可DinicO(nm),可匈牙利O(nm)

注意这里的DinicO(nm)跑得很满。

介绍一下匈牙利算法。

本质是找一条增广路非匹配边匹配边非匹配边,将其上状态互换,得到匹配数+1

给出匈牙利。

匈牙利板子
#include<bits/stdc++.h>

using namespace std;

const int maxn=510;
int n,m,k,ans,mat[maxn];
bool vis[maxn],g[maxn][maxn];

bool dfs(int u){
	for(int v=1;v<=m;++v){
		if(!g[u][v]||vis[v]) continue;
		vis[v]=true;
		if(!mat[v]||dfs(mat[v])){
			mat[v]=u;
			return true;
		}
	}
	return false;
}

int main(){
	scanf("%d%d%d",&n,&m,&k);
	for(int i=1;i<=k;++i){
		int u,v;
		scanf("%d%d",&u,&v);
		g[u][v]=true;
	}
	for(int i=1;i<=n;++i){
		memset(vis,0,sizeof(vis));
		if(dfs(i)) ans++;
	}
	printf("%d\n",ans);
	return 0;
} 

二分图最大权匹配

满足是最大匹配的同时边权和最大。

可以跑费用流,但时间复杂度不是多项式,是伪多项式O(nmf)。有KM算法,时间复杂度为O(n3)

König定理

对于一张二分图,最大匹配数等于最小点覆盖数(选最少的点使得每条边两端都有至少一个点被选中)。

构造就是从每个非匹配的右部点(或者左部点)出发,找增广路。把经过的每个点标记。最小点覆盖就是右边没被标记的点和左边被标记的点。

König定理推论

最大独立集最小点覆盖的补集

Hall定理

这是判断二分图是否有完美匹配的最高准则。

设左部点集合为VL,右部点集合为VR,那么任意|VL||VR|的二分图存在完美匹配的充要条件是:对左部点VL的任意一个子集S,与其相邻的右部点集合N(S)都满足|S||N(S)|

来证明一下,首先必要性是显然的,下证充分性。来反证法,假设有一张满足Hall定理但没有完美匹配的二分图。设xVL没有被匹配,yVRx相邻。

  • 如果y未匹配,那么直接匹配就行。

  • 如果y匹配了,那么设zy匹配了。用Hall定理,与S={x,z}相邻的右部点集合N(S)满足N(S)2,于是还有一个新点与{x,z}相邻。

可以发现第二种情况的过程类似于找增广路。由于最后|S|=|VL||N(S)|,一定可以找到一条增广路。于是得证。

典中典

DAG的最小不相交路径覆盖

点不相交。

Sol:

将每个点u拆成uLuR分别作为左右部点。

如果原图中有边uv,那么在二分图中就加边uLvR

原本每个点作为一条路径,覆盖整个DAG。二分图上每个匹配使得两条路径拼起来,路径数1。于是最小路径覆盖数即n最大匹配

DAG的最小可相交路径覆盖

点可以相交了。

Sol:

先传递闭包求出连通性。如果传递闭包后得到存在路径uv,就视作存在一条边uv。再跑上面的不可相交路径覆盖即可。

等着补吧。

posted @   RandomShuffle  阅读(9)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示