二分图进阶——定理、模型、复杂度分析

定理篇

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 定理,有:

\[\begin{aligned} &\forall S,\sum_{i\in S}w(i)\le \sum_{i\in N(S)}w(i)\\ &\Longleftrightarrow \forall S,\sum_{i\in S}c·p_i\le \sum_{T\cap S\neq \varnothing}f(T) \\ &\Longleftrightarrow \forall S,c\le\frac{ \sum_{T\cap S\neq \varnothing}f(T)}{\sum_{i\in S}p_i}\\ &\Longleftrightarrow c_{\max}=\min_{S}\left\lbrace\frac{ \sum_{T}f(T)-\sum_{T\subseteq{U-S}}f(T)}{\sum_{i\in S}p_i}\right\rbrace \end{aligned} \]

通过高维前缀和即可 \(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
posted @ 2024-07-08 21:44  spdarkle  阅读(6)  评论(0)    收藏  举报