二分图进阶——定理、模型、复杂度分析
定理篇
Vizing 定理
一般形式
令 \(G=(V,E)\),设 \(D(G)=\max_{u\in V}deg_u\),设 \(c\) 为用颜色 \(1\sim c\) 分别为 \(E\) 中每条边上色,使得所有有公共端点的边颜色不同。
则 \(D(G)\le c_{\min}\le D(G)+1\)。
根据 \(c=D(G)\) 与 \(c=D(G)+1\) 将所有图可以分为两类。其中判断一个一般图属于哪一类是 NP完全 的。具体可参见 link
特殊形式
我们声称,对于所有二分图,最小染色次数为 \(D(G)\)。
证明/构造方法:考虑归纳证明。
\(|E|=0\) 时显然,现在我们考虑将 \((u,v)\) 加入 \(E\)。设加入后图为 \(G'\),设 \(e(u,i)\) 为 \(u\) 是否有颜色 \(i\) 的边与其相连。
分类讨论。
- \(\exist i\in [1,D(G)],e(u,i)=e(v,i)=0\),显然将 \((u,v)\) 赋为 \(i\) 即可。
- \(\max(deg_u,deg_v)=D(G)\),显然 \(D(G')=D(G)+1\),所以可以赋值为新颜色。
- 排除以上情况后,我们可以知道,\(deg_u,deg_v<D(G)\),所以 \(\exist a,b,e(u,a)=e(v,b)=0\),且 \(a\neq b\)。所以我们考虑一个导出子图 \(G_0=(V,E_0)\),仅保留所有颜色为 \(a\) 或者 \(b\) 的边。
-
则显然 \(G_0\) 中 \(u,v\) 并不连通。假设其连通,则必然存在一条 \(u\to v\) 的路径,其边的颜色排布为 \(babababa……a\),有偶数个边,再加上新加入的边,则出现奇环,矛盾。
根据证明过程,也可以求出一种方案了。
具体参见 CF212A。
void change(int u){
if(!u)return ;
if(e[u][ch[col[u]]]){
if(col[e[u][ch[col[u]]]]!=-1)return ;
col[e[u][ch[col[u]]]]=col[u]^1;
change(e[u][ch[col[u]]]);
}
g.push_back(u);
// swap(e[u][ch[0]],e[u][ch[1]]);
}
void add(int u,int v){
for(int i=1;i<=c;i++)if(!e[u][i]&&!e[v][i]){
e[u][i]=v;e[v][i]=u;return ;
}
int a=0,b=0;
for(int i=1;i<=c;i++){
if(e[u][i]&&!e[v][i])a=i;
if(e[v][i]&&!e[u][i])b=i;
}
memset(col,-1,sizeof col);
col[u]=0,col[v]=1;ch[0]=a,ch[1]=b;g.clear();
change(v);
for(auto x:g)swap(e[x][a],e[x][b]);
e[u][b]=v,e[v][b]=u;
}
例 CF212A
给定一张二分图,要求将每条边颜色染为 \(c\) 种颜色之一,使得所有点的颜色最大出现次数减去最小出现次数之和最小。
我们可以将一个点每 \(c\) 条边拆一个新点,要求两两颜色不同,所以一个点的 \(\max-\min=[deg_u\bmod c\neq 0]\)
所以答案是 \(|V|-\sum_{i\in V}[c|deg_i]\)
König 定理
最小点覆盖等于最大匹配
-
对于任意二分图G,最小点覆盖=最大匹配
-
点覆盖指的是选择一些点,使得所有的边至少有一个端点被选择
-
匹配指的是选择一些边,使得这些边没有公共点
-
对于任意图G,最小点覆盖>=最大匹配
-
独立集:选一些点,这些点互不相邻
-
团:选一些点,这些点两两相邻
-
(任意图)最大独立集=所有点数-最小点覆盖
-
任意图,最大团=补图的最大独立集(AGC099E)
-
最小路径覆盖问题 \(n\) 个点DAG的最小链覆盖(链互不相交)=\(n\)-二分图最大匹配
-
DAG建二分图方法是把一个点拆成出点和入点
-
链可以在点相交时,先求传递闭包(bitset,拓扑排序,n^2/w)。祭祀
Dirwoths 定理
给定偏序集(可以理解为一个DAG,可达构成偏序)。
-
反链是指图中的一个点的集合,使得集合内点两两不可达;这里的链覆盖是指用若干条 可以相交(点交) 的链覆盖图中所有的点。
-
DAG 的最长反链大小等于最小链覆盖个数。可以根据祭祀,每条链都能且仅能给最长反链贡献一个元素。
-
证明:转化为二分图后,最长反链大小等价于最大独立集大小等价于 \(|V|\) 减去最小点覆盖等价于最小链覆盖。
-
DAG 的最长链大小等于最小反链划分个数。(补图的最长反链就是最长链大小)
Hall 定理
一般形式:
对于二分图 \(G=(V_1,V_2,E),|V_1|\le |V_2|\),设 \(S\subseteq V_1,N(S)\) 是 \(S\) 中所有点的边在 \(V_2\) 的端点的集合。
若 \(\forall S\subseteq V_1,|S|\le |N(S)|\),则 \(G\) 存在完备匹配。
推论:对于任意二分图,最大匹配为:
\(\min(|V_1|-|S|+|N(S)|)=|V_1|-\max(|S|-|N(S)|)\)。
理由是 \(|V_1-S|\) 与 \(N(S)\) 是原图的一个点覆盖。
常与数据结构综合考察
例:ARC076D & LOJ6062
带权形式
设每个点有点权 \(w(x)\),则有完备匹配的充要条件是:
\(\forall S\subseteq V_1,\sum_{i\in S}w(i)\le \sum_{i\in N(S)}w(i)\)。
一般形式是 \(\forall i,w(i)=1\)。
例:[PKUSC2022]撸猫
给定 \(n\),以及 \(f_{0}\sim f_{2^n-1}\),设 \(p_i=\sum_{i\in S}f_S\),求最大的 \(c\),满足存在一个二维数组 \(g_{S,i}\) 满足 \(\forall i,\sum_{i\in S}g_{S,i}\ge c·p_i,\forall S,\sum_{i\in S}g_{S,i}=f_S\)。
这种权值分配问题一般考虑用网络流分流(意即分权)。
所以左部点 \(2^n\) 个,右部点 \(n\) 个,编号从零开始,存在边 \((u,v)\) 当且仅当 \(u\& 2^v=2^v\)。
然后左部点点权是 \(f_S\),右部点点权是 \(p_i\)。
根据 Hall 定理,有:
通过高维前缀和即可 \(O(n2^n)\) 计算。
模型篇
二分图上博弈模型
给定一张二分图,判断从某个点开始是否有先手必胜。
游戏规则如下:
每条边只能走一次,不能移动方算输。
每次只能走一条边。
先手必胜当且仅当任意最大匹配方案都包含起点。
证明:
充分:先手每一次走一条匹配边,则后手只能走非匹配边回来,然后先手又走一个最大匹配方案中的匹配边……最终一定会走一个匹配边,然后后手不能走。如果最后一步是走非匹配边,则把经过的路径取反,可以得到存在一个最大匹配方案,不包含起点,矛盾。
必要:如果不是这样,先手第一次一定会走到某个最大匹配方案中的匹配点(否则就有了新的匹配,矛盾),然后先后手交换即证。
常结合二分图的必经点,必经边进行考察。
二分图必经边:只保留残量网络中正权边,显然是有向图,缩点,若一条边在原最大匹配上,且连接两个端点不在同一SCC则必经。
二分图必经点:从 \(S\) 出发走边权为正的边到达的所有左部点以及从 \(T\) 出发只走边权为零的边到达的所有右部点构成非必经点集合。
可行边:在同一SCC中或者在原最大匹配中
可行点:可行边和必经边的端点
求解篇
基础知识:一些匹配的复杂度相关。
基本匹配复杂度:
- 匈牙利算法,\(O(nm)\)
- Dinic,\(O(m\sqrt n)\)
- 简单容量网络,边的容量均为 \(1\),所有的中间点或者入度为1或者出度为 \(1\),对于简单容量网络 \(N\),Dinic 算法在 \(O(m\sqrt n)\) 步内终止计算
- 容量均为一的网络,不高于 \(O(n^{\frac{2}{3}}m)\)
- 最小字典序匹配方案:
-
如果右部点的度数均 \(\le2\),可以用匈牙利算法,直接把枚举左边的点改成标号从大到小,那么晚枚举的点,会优先匹配标号小的点
- 一般方法:考虑先求出一个最大匹配 \(T\),我们考虑能否将新的边 \(e=(u,v)\) 加入匹配中,显然我们判断是否存在经过 \(e\),且依次为匹配边,非匹配边的环(偶环,因为没有增广路),然后将其所有的进行交换颜色即可。考虑依次枚举最小匹配点进行交换即可 \(O(n(n+m))\)。只需要固定端点,在每个点都跑一次DFS进行判断。link

浙公网安备 33010602011771号