二分图详解

正题

性质

二分图不存在奇环

所以二分图判定可以使用黑白染色。

最大匹配=最小点覆盖

对于每个匹配,只需要选择连接非匹配点的一个端点即可,在一个匹配中,这样的端点至多只会有一个,否则会产生新的匹配,而每个匹配都至少需要一个点,且两两匹配端点不重合,所以最大匹配=最小点覆盖。

最小边覆盖=顶点数-最大匹配

设顶点数是 n n n , 最大匹配是 m m m ,覆盖的点数是 2 m 2m 2m ,剩下来的设为 a a a ,那么 2 m + a = n 2m+a=n 2m+a=n ,总共用了 m + a = n − m m+a=n-m m+a=nm

最大独立集=顶点数-最大匹配

也利用了一个匹配中,连接非匹配点的只有至多一个端点的条件,那么规定每个匹配中这样的点不取就好了。

Hall定理

完美匹配:最大匹配数为 m i n ( ∣ X ∣ , ∣ Y ∣ ) min(|X|,|Y|) min(X,Y)

任何正则二分图都有完美匹配。

二分图存在完美匹配的充要条件是满足,对于该图,左边任意 k k k 个点的邻集大小至少为 k k k

t-条件:若左部点均满足 d e g ≥ t deg\geq t degt,则右部点均满足 d e g ≤ t deg\leq t degt

若二部图满足 t-条件,可推出该二部图有完美匹配。

H a l l Hall Hall 定理的拓展: a n s = ∣ X ∣ − max ⁡ X ′ ⊂ X ( ∣ X ′ ∣ − ∣ t r ( X ′ ) ∣ ) ans=|X|-\max_{X'\subset X}(|X'|-|tr(X')|) ans=XmaxXX(Xtr(X)),其中 t r ( X ′ ) tr(X') tr(X) 表示 X ′ X' X 的邻集。

匈牙利算法

代码很简单,不再赘述。

bool dfs(int x,int k){
	if(vis[x]==k) return 0;
	vis[x]=k;
	for(int i=first[x];i!=0;i=s[i].next){
		int y=s[i].y;
		if(last[y]==0 || dfs(last[y],k)){
			last[y]=x;
			return 1;
		}
	}
	return 0;
}

时间复杂度为 O ( n m ) O(nm) O(nm)

二分图最佳完美匹配

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值