正题
性质
二分图不存在奇环
所以二分图判定可以使用黑白染色。
最大匹配=最小点覆盖
对于每个匹配,只需要选择连接非匹配点的一个端点
即可,在一个匹配中,这样的端点至多只会有一个,否则会产生新的匹配,而每个匹配都至少需要一个点,且两两匹配端点不重合,所以最大匹配=最小点覆盖。
最小边覆盖=顶点数-最大匹配
设顶点数是 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=n−m 。
最大独立集=顶点数-最大匹配
也利用了一个匹配中,连接非匹配点的只有至多一个端点
的条件,那么规定每个匹配中这样的点不取就好了。
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 deg≥t,则右部点均满足 d e g ≤ t deg\leq t deg≤t。
若二部图满足 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=∣X∣−maxX′⊂X(∣X′∣−∣tr(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) 。