二分图&网络流
Some Definitions
二分图:可以将图的点集分为\(X,Y\)两部分,满足不存在边连接\(X,Y\)两个点集。默认\(|X|\le|Y|\)。
补图:\(G=(V,E)\)的补图\(G'=(V,\{(u,v)|(u,v)\notin E\})\)。
最大匹配:最大的任意点最多只被一条边覆盖的边集。
最小点覆盖:最小的任意边都至少有一个端点被覆盖的点集。
最小链覆盖:最小的任意点都被覆盖的不存在相交链的链集。
最长反链:最大的任意两点相互不可达的点集。
最大独立集:最大的生成子图为空集的点集。
完美匹配:二分图的最大匹配至少完全覆盖了二分图的两个点集\(X,Y\)中的一个。
二分图的邻集:\(\forall W\subseteq X,S_W=\{v\in Y|\exists u\in W,(u,v)\in E\}\)。\(S_W\)叫\(W\)的邻集。(当然把\(X,Y\)反过来也没问题。)
DAG的对应二分图:一个DAG\(G=(V,E)\)的对应二分图为\((X\cup Y,\{(x_u,y_v)|\exists(u,v)\in E\})\)。
割:给定一个网络\(G=(V,E)\),若删掉一个边集\(E'\subseteq E\)会使得源汇点不再连通,那么称\(E'\)为\(G\)的一个割。
最小割:最小割\(C(G)\)为\(G\)的割中边的容量和最小的一个割。
闭合子图:对于有向图图\(G=(V,E)\),其点集\(S\subseteq V\)是闭合子图当且仅当\(\{v|\exists u\in V,(u,v)\in E\}\subseteq S\)。
扩展图:对于一个有向图\(G=(V,E)\),其扩展图为\(ex(G)=(V\cup\{s\}\cup\{t\},\{(u,v,+\infty)|(u,v)\in E\}\cup\{(s,u,w_u)|w_u>0\}\cup\{(u,t,-w_u)|w_u<0\})\)。说人话就是把原图中的边的边权定为\(+\infty\),源点到所有正权点连边权等于点权的边,所有负权点到汇点连边权等于点权的绝对值的边。
简单割:所有边都与\(s\)或\(t\)相连的割。
Some Theorems
Hall定理:二分图存在完美匹配\(\Leftrightarrow\forall W\subseteq X,|W|\le|S_W|\)
推论:一个二分图的最大匹配数为\(|X|+\min(0,\min\limits_{W\subseteq X}(|W|-|S_W|))\)
König定理:二分图的最小点覆盖数等于其最大匹配数
因为最大匹配的边的端点是不相交的,所以最小点覆盖数至少不会小于最大匹配数。
如果我们能够给出一组构造方案,那么就证明了该定理。
下面将给出由最大匹配构造最小点覆盖的方法。
我们知道匈牙利算法中要寻找的增广路是一条边在当前匹配,下一条边不在当前匹配,且起点和终点都未被覆盖的路径。
在起点集中枚举每一个未被最大匹配覆盖的点,从这个点出发找到以其为起点的所有增广路,并标记路上的所有点。
最后起点集中未被标记的点和终点集中被标记的点就是最小点覆盖。
定理:二分图的最大独立集为最小点覆盖的补集
把最小点覆盖去掉后,一定不存在两个端点都未被去掉的边,因此剩下的就是最大独立集。
推论:二分图的最大带权独立集等于总点权减去最小割
定理:一张图的最大团等于其补图的最大独立集
定理:一个DAG的最小链覆盖数等于总点数减去其二分图的最大匹配数
最大匹配中的边\(u,v\)就相当于把原图中的\(u,v\)两个点缩成一个点,所以最后剩下的点数即最小链覆盖数等于总点数减最大匹配数。
Dilworth定理:DAG的最长反链数等于最小链覆盖数
懒得证了,下面给出构造方法。
设DAG有\(n\)个点,其最大匹配数为\(m\)。
先构造出DAG的二分图,求出其最大独立集。
然后如果\(X_i,Y_i\)都在独立集中,我们就将其加入反链。
最大流最小割定理:最小割等于最大流
若最小割小于最大流,那么割掉这些边之后残量网络中一定还有增广路。因此最小割大于等于最大流。
如果我们能够构造一组方案使得最小割等于最大流,那么该定理成立。
从源点开始把残量网络BFS一遍,标记源点能够到达的点。连接标记点和未标记点的边构成最小割集。
定理:有向图\(G\)的最大权闭合子图的点权为其扩展图\(ex(G)\)去掉\(C(ex(G))\)之后\(s\)能够到达的点构成的点集。
我们先给出两个显而易见的小结论:
\(1.ex(G)\)的最小割一定是简单割。
\(2.\)割掉\(ex(G)\)中任意一个简单割之后\(s\)所能到达的点构成的点集是一个闭合子图。
记\(s\)能到达的点构成的点集为\(S\),\(T=V-S\)。
最小割对应的\(S\)是一个闭合子图,接下来你我们就将证明\(S\)是原图的最大权闭合子图。
一个割的容量\(F(E')=\sum\limits_{u\in T\wedge w_u>0}w_u+\sum\limits_{u\in S\wedge w_u<0}|w_u|\)。
其对应闭合子图的点权和\(W(E')=\sum\limits_{u\in S}w_u\)。
那么\(F(E')+W(E')=\sum\limits_{u\in V\wedge w_u>0}w_u\)是一个定值。
因此\(F(E')\)越小\(W(E')\)就越大。
所以最小割对应的闭合子图就是最大权闭合子图。
Some Extensions
最长反链
可能在最长反链中的点
枚举每一个点,把与它相关的点删掉,再跑最长反链。
如果新的长度是原本的长度\(-1\),那么这个点就在最长反链中。
一定在最长反链中的点
枚举每一个点,把它删掉,再跑最长反链。
如果新的长度是原本的长度\(-1\),那么这个点就在最长反链中。
二分图最大匹配
可能在二分图最大匹配中的点
所有有度数的点都有可能。
一定在二分图最大匹配中的点
在最大匹配且在残量网络中\(s\)无法到达的左侧点和无法到达\(t\)的右侧点。
可能在二分图最大匹配中的边
先求出任意一个最大匹配\(M\),\(M\)中的边都可能在二分图最大匹配中。
然后考虑其它的边,如果该边有至少一个端点不在\(M\)中,那么这条边可能在二分图最大匹配中。
如果两个端点都在\(M\)中,那么我们需要一个交错环才能把这条边加入最大匹配。
那么我们将\(M\)中的边从左往右定向,不在\(M\)中的边从右往左定向,如果一条边的两个端点在同一个SCC的话,那么这条边也可能在二分图最大匹配中。
一定在二分图最大匹配中的边
先求出任意一个最大匹配\(M\),一定在二分图最大匹配中的边是\(M\)中不属于任意一个交错环的边。
那么我们将\(M\)中的边从左往右定向,不在\(M\)中的边从右往左定向,如果一条\(M\)中的边的两个端点不在同一个SCC的话,那么这条边一定在二分图最大匹配中。
最小割
最小割输出方案
如果一条边\((u,v)\)满流,且\(u\)和\(s\)连通,\(v\)和\(t\)不连通,那么将这条边加入最小割。
可能在最小割中的边
对残量网络tarjan,如果一条满流的边的两个端点不在同一个SCC中,那么这条边可能在最小割中。
一定在最小割中的边
对残量网络tarjan,如果一条满流的边\((u,v)\)满足\(u\)和\(s\)在同一个SCC,\(v\)和\(t\)在同一个SCC,那么这条边一定在最小割中。
环覆盖问题1
给定一个有向图,选出若干个点不相交的环,最小化环覆盖的点集升序排序后的字典序。
给每个点加个自环,这样我们转化为了每个点入度出度为\(1\)。
建原图的二分图,跑一个完美匹配出来。
然后从小到大枚举每个点,如果该点不是被原图中的自环(即二分图中自己连自己)所覆盖,那么把这个点加入点集,跳过。
否则删掉该点在原图中自环对应的边,找一条从该点对应左侧点到该点对应右侧点的增广路。
如果找到了,那么把增广路上的边的状态反转,并把这个点加入点集中。
加自环这个套路在其他环覆盖问题中也很有用。
上下界网络流
每条边的流量有上界和下界\([l(u,v),r(u,v)]\)。
⽆源汇上下界可⾏流
新建源点汇点\(s,t\)。
对于原网络中的边\((u,v,l,r)\),在新网络中建\(3\)条边:\((s,v,l),(u,t,l),(u,v,r-l)\)。
然后跑最大流,如果所有连接\(s\)的边都流满了那么说明存在可行流,原图中\((u,v,l,r)\)的流量为\(l+\)新图中\((u,v,r-l)\)的流量。
有源汇上下界可⾏流
加一条边\((s,t,0,+\infty)\),然后跑无源汇上下界可行流。
有源汇上下界最大流
先跑一遍有源汇上下界可⾏流,然后还原出原图的流量网络及残量网络,再在原图的残量网络上跑\(s\rightarrow t\)的最大流。
有源汇上下界最小流
先跑一遍有源汇上下界可⾏流,然后还原出原图的流量网络及残量网络,再在原图的残量网络上跑\(t\rightarrow s\)的最大流。
最大密度闭合子图
\(\rho=\frac{|E|}{|V|}\)
二分答案\(mid\),现在问题变成了判定是否有一个闭合子图满足\(|E|-|V|mid>0\)。
如果我们不考虑闭合这个限制的话,最优的选法肯定是选择所有的边,放弃所有的点。
也就是说现在我们有\(|E|\)点收益,放弃一条边会付出\(1\)的代价,选择一个点会付出\(mid\)的代价,必须满足选择一条边就选择它的两个端点。我们希望最小化付出的代价,然后检查代价是否小于\(|E|\)。
考虑最小割,\(s\)到每条边流量为\(1\),每个点到\(t\)流量为\(mid\),每条边到两个端点流量为\(+\infty\)。
那么这张图的最小割就是最小代价。
距离限制模型
有\(n\)个取值在\([1,m]\)内的整数变量,如果第\(i\)个变量的取值是\(a_i\),那么需要付出\(c_{i,a_i}\)的代价。
同时给定一些限制\(a_u-a_v\le d\)。
求满足限制下的最小代价。
建\(n\)条\(s->x_{i,1}->\cdots->x_{i,m}->t\)的链,其中连向\(x_{i,j}\)的边的容量为\(c_{i,j}\),连向\(t\)的边的容量为\(+\infty\)。
在这个网络上求最小割,得到的就是没有限制下的最小代价。
然后对于限制\(a_u-a_v\le d\),\(\forall i\in(d,m]\),新建\((x_{u,i},x_{v,i-d},+\infty)\)。
在这个网络上求最小割,得到的就是有限制下的最小代价。
二元关系最小割模型
有\(n\)个bool变量,其中第\(i\)个变量的取值为\(0/1\)会获得\(u_i/v_i\)的收益。
同时给定一些限制,如果第\(i\)个变量取值为\(a\),第\(j\)个变量取值为\(b\),那么需要付出\(c\)的代价。
求最大的收益减代价。
\(\forall i\in[1,n]\),连\(s\rightarrow i\rightarrow t\)。
如果割掉\(s\rightarrow i\)就代表\(i\)取\(0\),如果割掉\(i\rightarrow t\)就代表\(i\)取\(1\)。
然后对于限制\((i,j,a,b,c)\),连\(i\leftrightarrow j\)。
边的容量可以列方程解出。