二分图相关技术
Bipartite Graph.
无特殊说明时,\(n\)为点数,\(m\)为边数。
基础部分
定义和判定
点集可以分成两个集合,任意一个集合内部没有边。
性质:没有奇环。这是充要条件。用这个来\(O(n+m)\)来判定二分图。
二分图最大匹配
可Dinic\(O(n \sqrt m)\),可匈牙利\(O(nm)\)。
注意这里的Dinic\(O(n\sqrt m)\)跑得很满。
介绍一下匈牙利算法。
本质是找一条增广路\(\texttt{非匹配边}\to \texttt{匹配边}\to \dots\to\texttt{非匹配边}\),将其上状态互换,得到匹配数\(+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(n^3)\)。
König定理
对于一张二分图,最大匹配数等于最小点覆盖数(选最少的点使得每条边两端都有至少一个点被选中)。
构造就是从每个非匹配的右部点(或者左部点)出发,找增广路。把经过的每个点标记。最小点覆盖就是右边没被标记的点和左边被标记的点。
König定理推论
最大独立集为最小点覆盖的补集。
Hall定理
这是判断二分图是否有完美匹配的最高准则。
设左部点集合为\(V_L\),右部点集合为\(V_R\),那么任意\(|V_L|\le |V_R|\)的二分图存在完美匹配的充要条件是:对左部点\(V_L\)的任意一个子集\(S\),与其相邻的右部点集合\(N(S)\)都满足\(|S|\le |N(S)|\)。
来证明一下,首先必要性是显然的,下证充分性。来反证法,假设有一张满足Hall定理但没有完美匹配的二分图。设\(x\in V_L\)没有被匹配,\(y\in V_R\)与\(x\)相邻。
-
如果\(y\)未匹配,那么直接匹配就行。
-
如果\(y\)匹配了,那么设\(z\)与\(y\)匹配了。用Hall定理,与\(S=\{x,z\}\)相邻的右部点集合\(N(S)\)满足\(N(S)\ge 2\),于是还有一个新点与\(\{x,z\}\)相邻。
可以发现第二种情况的过程类似于找增广路。由于最后\(|S|=|V_L|\le |N(S)|\),一定可以找到一条增广路。于是得证。
对于一般的最大匹配,可以证明最大匹配等于 \(|V_L|-\max\limits_{S\subseteq V_L}\{|S|-|N(S)|\}=\min\limits_{S\subseteq V_L}\{|V_L|-|S|+|N(S)|\}\)。左右部交换显然是一样的。
还有拓展形式,对于一个左部点可以匹配 \(R_i\) 个右部点,一个右部点可以被 \(L_i\) 个左部点匹配的情况,有完美匹配当且仅当对左部点任意一个子集 \(S\),\(\sum\limits_{v\in S} R_v\le \sum\limits_{v\in N(S)} L_v\)。
类似的,最大匹配为 \(\sum R_v-\max\limits_{S\subseteq V_L}\{\sum\limits_{v\in S} R_v - \sum\limits_{v\in N(S)} L_v\}=\min\limits_{S\subseteq V_L}\{\sum R_v-\sum\limits_{v\in S} R_v+\sum\limits_{v\in N(S)} L_v\}\)。这里的最大匹配是类似网络流一样流出的最大流。
所以 Hall 定理也可以对二分图上的最大流列出式子,然后套 DS 计算。通常来说,网络流/二分图中出现了区间连边的情况,就可以用 Hall 定理。对于任意一个子集的限制,可以归纳到对一段区间的限制上,就可以简单维护了。
典中典
DAG的最小不相交路径覆盖
点不相交。
Sol:
将每个点\(u\)拆成\(u_L\)和\(u_R\)分别作为左右部点。
如果原图中有边\(u\to v\),那么在二分图中就加边\(u_L\to v_R\)。
原本每个点作为一条路径,覆盖整个DAG。二分图上每个匹配使得两条路径拼起来,路径数\(-1\)。于是最小路径覆盖数即\(n-\texttt{最大匹配}\)。
DAG的最小可相交路径覆盖
点可以相交了。
Sol:
先传递闭包求出连通性。如果传递闭包后得到存在路径\(u\leadsto v\),就视作存在一条边\(u\to v\)。再跑上面的不可相交路径覆盖即可。
等着补吧。
经典结论
边染色
二分图边染色,共顶点的边颜色不同,所需的最少颜色数为 \(\max \deg_u\)。
易得答案 \(\ge \max \deg_u\)。考虑构造这个下界。
以任意顺序加入边,考虑 \((u,v)\) 以及 \(u,v\) 各自相邻的颜色集合 \(C_u,C_v\)。直观的想法是染成 \(\min\{\text{mex}(C_u),\text{mex}(C_v)\}\)。如果二者的 \(\text{mex}\) 相同,那么就对了。否则不妨 \(\text{mex}(C_u)<\text{mex}(C_v)\),那么考虑调整与 \(v\) 相邻的 \((v,k)\),其颜色从 \(\text{mex}(C_u)\) 改成 \(\text{mex}(C_v)\),如此递归改下去。结合二分图的性质容易发现这样总是会停下来的。类似于找增广路。时间复杂度是 \(O(nm)\) 的。
特殊地,无向简单图上,答案 \(x\in [\max \deg_u,1+\max \deg_u]\)。

浙公网安备 33010602011771号