Some Definitions
二分图:可以将图的点集分为(X,Y)两部分,满足不存在边连接(X,Y)两个点集。默认(|X|le|Y|)。
补图:(G=(V,E))的补图(G'=(V,{(u,v)|(u,v)
otin E}))。
最大匹配:最大的任意点最多只被一条边覆盖的边集。
最小点覆盖:最小的任意边都至少有一个端点被覆盖的点集。
最小链覆盖:最小的任意点都被覆盖的不存在相交链的链集。
最长反链:最大的任意两点相互不可达的点集。
最大独立集:最大的生成子图为空集的点集。
完美匹配:二分图的最大匹配至少完全覆盖了二分图的两个点集(X,Y)中的一个。
二分图的邻集:(forall Wsubseteq X,S_W={vin Y|exists uin W,(u,v)in E})。(S_W)叫(W)的邻集。(当然把(X,Y)反过来也没问题。)
DAG的对应二分图:一个DAG(G=(V,E))的对应二分图为((Xcup Y,{(x_u,y_v)|exists(u,v)in E}))。
割:给定一个网络(G=(V,E)),若删掉一个边集(E'subseteq E)会使得源汇点不再连通,那么称(E')为(G)的一个割。
最小割:最小割(C(G))为(G)的割中边的容量和最小的一个割。
闭合子图:对于有向图图(G=(V,E)),其点集(Ssubseteq V)是闭合子图当且仅当({v|exists uin V,(u,v)in E}subseteq S)。
扩展图:对于一个有向图(G=(V,E)),其扩展图为(ex(G)=(Vcup{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定理:二分图存在完美匹配(Leftrightarrowforall Wsubseteq X,|W|le|S_W|)
推论:一个二分图的最大匹配数为(|X|+min(0,minlimits_{Wsubseteq 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')=sumlimits_{uin Twedge w_u>0}w_u+sumlimits_{uin Swedge w_u<0}|w_u|)。
其对应闭合子图的点权和(W(E')=sumlimits_{uin S}w_u)。
那么(F(E')+W(E')=sumlimits_{uin Vwedge 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 ightarrow t)的最大流。
有源汇上下界最小流
先跑一遍有源汇上下界可⾏流,然后还原出原图的流量网络及残量网络,再在原图的残量网络上跑(t ightarrow s)的最大流。
最大密度闭合子图
( ho=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_vle d)。
求满足限制下的最小代价。
建(n)条(s->x_{i,1}->cdots->x_{i,m}->t)的链,其中连向(x_{i,j})的边的容量为(c_{i,j}),连向(t)的边的容量为(+infty)。
在这个网络上求最小割,得到的就是没有限制下的最小代价。
然后对于限制(a_u-a_vle d),(forall iin(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 iin[1,n]),连(s
ightarrow i
ightarrow t)。
如果割掉(s
ightarrow i)就代表(i)取(0),如果割掉(i
ightarrow t)就代表(i)取(1)。
然后对于限制((i,j,a,b,c)),连(ileftrightarrow j)。
边的容量可以列方程解出。