「学习笔记」二分图和网络流
序言
基本是对ix35整理内容的抄写。所以你会发现大量的重合。
只有一些不偏向定义的才会用自己能更好理解的话解释出来。
所以一些证明会相比其他人说明更加繁琐,不过这是写这篇文章此时的我能力内的理解,如果将来有更好的理解,能从更高的角度 / 从更简洁的语言出发,还会更新。
定理和推论,构造方案相关,也就是除去定义和证明以外比较重要的内容,都加粗了,复习的时候可以直接看加粗的内容。
二分图
二分图
定义
对于无向图 \(G=(V,E)\),若存在将 \(V\) 划分成两个不相交子集 \(A,B\) 的方案,使得 \(A,B\) 的点导出子图都不含边,则称 \(G\) 为二分图,\(A,B\) 为 \(G\) 的两部。
即 \((u,v)\in E\to (u\in A,v\in B)\vee(u\in B,v\in A)\).
根据定义,我们可以得出二分图是可以被二染色的图,即把每个节点着黑白两色之一,使得每条边的两个端点颜色不同,这等价于二分图的定义。
定理:图 \(G\) 为二分图,当且仅当 \(G\) 中不存在长度为奇数的环。
注:这里讨论的环如无特殊说明均为简单环,具体标准定义参考 oi-wiki。
可以用二染色来证明这个定理。
若 \(G\) 中存在长度为奇数的环 \(v_1,v_2,...,v_{2k-1}\),那么将 \(v_1\) 染成黑色(黑白两色是对称的),那么 \(v_2\) 一定要染成白色。以此类推,\(v_1,v_3,...,v_{2k-1}\) 都要染成黑色,由于 \(v_1\) 和 \(v_{2k-1}\) 相邻,所以该图不能被二染色,则该图不是二分图。必要性得证。
若 \(G\) 中不存在长度为奇数的环,由于各个连通分量之间相互独立,考虑其中任意一个连通分量:求出任意一棵生成树,对于生成树上奇数深度的点染成黑色,偶数深度的点染成白色,由于不存在奇环,则相同颜色点之间必然没有边相连,即得到一个二染色方案,则该图是二分图。充分性得证。
推论:二分图 \(G\) 的任意子图都为二分图
推论:图 \(G\) 是二分图当且仅当其每个连通分量都是二分图。
证明是比较显然的,因为图 \(G\) 是二分图则其任意子图中都不存在奇环;图 \(G\) 不存在奇环等价于其各个连通分量里都不存在奇环。
至此,我们可以得出判断一张图是否为二分图的算法:
- 对于图 \(G\),根据第二条推论,只需要判断每个连通分量是否是二分图。
- 对于图 \(G\) 的任意一个连通分量,从任意一点开始 dfs,来求出任意一棵生成树,如果遇到非树边,判断深度的奇偶性是否相同,若相同,那么出现了奇环,\(G\) 不是二分图;若所有非树边两端点深度奇偶性都相同,则根据深度奇偶性划分可得到一个二染色。
- 综上,可在时间复杂度 \(\mathcal{O}(|V|+|E|)\) 内解决问题。
给定无向图 \(G=(V,E)\),每个点有 \(0\) 或 \(1\) 的一个标记,有 \(q\) 组询问,每组询问给定 \(s,t\in V\),你需要求出是否存在一条 \(s\to t\) 的路径 \(P\),使得路径经过的点的标记拼成一个回文。\(P\) 可以不是简单路径。
\(1\leq n\leq 5000,1 \leq m \leq 5\times 10^5,1 \leq q \leq 10^6\).
暴力的想法是考虑 \(f_{i,j}\) 为 \(i\) 是否能走到 \(j\),然后用类似 bfs 的方法更新 \(f\),每次从队列中取出一个 \(f\),往两边扩展,如果能更新新的 \(f\) 就扔进队列里面。这样复杂度是 \(\sum deg\times\sum deg=\mathcal{O}(m^2)\).想办法优化这个暴力,也就是减少无用的边数。
如果要经过 \((u,v)\) 从点 \(u\) 走到点 \(v\),考虑可以在这条边上来回折返,那么我们只关心这两个点组成的 \(01\) 串出现次数的奇偶性。
考虑仅有两端点为 \(00\) 或者 \(11,10(01)\) 的边及其端点组成的连通块,假设为 \(00\):如果要经过这个连通块,由于只关心路径上 \(00\) 出现次数的奇偶性,所以要保留的信息仅为任意两点之间路径经过边数奇偶性的可能性。
考虑到如果连通块中有奇环,那么在这个奇环中走一圈会到起点,即可改变路径奇偶性,则任意两点经过的边数奇偶都可以;如果没有奇环,说明是个二分图,那么两点如果在同一部点中,则经过边数一定是偶数,否则经过边数一定是奇数。
由于我们只关心经过路径奇偶性,所以如果该连通分量是二分图,那么直接保留一个尽量小的连通子图,保留一棵生成树即可,如果该连通分量不是二分图,保留一棵生成树然后加一个非树边组成一个奇环即可,例如一个自环。可以发现这样边数降到了 \(\mathcal{O}(n)\),任意两点之间路径经过边数奇偶性的可能性不变。
这样子建图之后做那个 bfs 就可以 \(\mathcal{O}(n^2+q)\) 解决这个问题。
二分图最大匹配
二分图最大匹配问题,即对于给定的二分图 \(G=(V,E)\),求出大小最大的边集 \(A\subseteq E\) 使得 \(A\) 中不存在两条共端点的边。
匈牙利算法
令 \(P\) 是一个匹配,其中的边称为匹配边,匹配边的端点称为匹配点,如果一条路径从一个未匹配的左部点出发到达一个未匹配的右部点,交替经过不在 \(P\) 中的边和在 \(P\) 中的边,则称该路径为一条增广路。
定理:匹配 \(P\) 是二分图的最大匹配,当且仅当图中不存在增广路。
必要性:将这条增广路上的所有匹配边改为非匹配边,所有非匹配边改为匹配边,则匹配数量增加。
充要性:反证法。对于匹配 \(P\) 满足图中不存在增广路。假设图中最大匹配为 \(P'\),则求出 \(P\) 和 \(P'\) 边导出子图的对称差 \(T\).由于 \(P\) 和 \(P'\) 都是匹配,则 \(T\) 中点的度数均不超过 \(2\),则 \(T\) 为若干个环和若干条链构成,如果 \(P\) 小于 \(P'\),说明 \(T\) 中属于 \(P'\) 的边要更多,由于环和偶链属于两者的边数相等,那么就说明一定存在奇链,即为一条增广路,与假设不符。
由充要性的证明,引出匈牙利算法:
枚举左部点 \(i=1,2,...,n\),维护 \(1,2,...,i-1\) 与右部点的匹配,尝试对 \(i\) 进行匹配,进入以下过程:
- 假设尝试对左部点 \(x\) 进行匹配,枚举出边到达的点 \(y\):
- 若 \(y\) 没有被匹配,则找到一个增广路 \(x\to y\);
- 否则尝试对 \(y\) 匹配的左部点 \(x'\) 进行匹配,若匹配成功则找到一个增广路 \(x\to y\to x'\to ...\).若找到增广路,则将增广路上的边选择状态取反,答案 \(+1\).
- 优化:每次从 \(i\) 寻找增广路时,如果一个左部点 \(x\) 或者右部点 \(y\) 之前被检查过没有找到增广路,则不必再检查一遍。
- 对于每个左部点,检查是 \(\mathcal{O}(m)\) 的,故算法的时间复杂度为 \(\mathcal{O}(nm)\).
匈牙利算法基于一个贪心的原则:一个点一旦进入匹配,就不会重新成为非匹配点,因此当找不到增广路时表示 \(i\) 在保持 \(1,\ldots,i-1\) 的匹配情况不变时一定无法加入最大匹配中。
基于此,我们可以得知,若将匹配成功的左部点视为 \(1\),没有匹配的视为 \(0\),则按照枚举顺序来拼接这些左部点,得到的字典序是最大的。
最大流做法
建立源点 \(s\) 和 汇点 \(t\),\(s\) 向每个左部点连 \((s,x,1)\),每个右部点向 \(t\) 连 \((x,t,1)\),二分图上的边都是左部点向右部点连 \((u,v,1)\),求出最大流即为最大匹配。
用 Dinic 实现复杂度为 \(\mathcal{O}(\sqrt n m)\).
容易把问题转化为给定左部点度数均为 \(2\) 的二分图,求左部点对应匹配点字典序最小的完美匹配。
先考虑把能确定的都确定下,也就是考虑度数为一的右部点,将其与对应的左部点匹配,然后删掉。如果出现零度点则无解。
这样子剩余的左部点和右部点个数相等,并且右部点的度数都 \(\geq 2\)(出现度数为 \(0\) 无解,出现度数为 \(1\) 的会被删掉),由于左部点度数都等于 \(2\),说明右部点的度数也都等于 \(2\).
所以此时图是若干个环组成的,对于每个环来说,只有两个完美匹配,选取字典序较小的那一个即可。
时间复杂度易做到线性。
覆盖与独立集
二分图最小点覆盖
最小点覆盖:在图中选择尽量少的点使得每条边至少有一条边被选。
König定理:二分图最小点覆盖大小等于最大匹配大小。
这里给出一种最小点覆盖的构造方法:
- 对于每个右边每个失配点,尝试走增广路,即“一条匹配,一条没匹配...这样交替出现的路径”,将所有走到的点都打上标记,称之为标记点。
- 左侧的标记点和右侧的未标记点组成了最小点覆盖。
- 证明其是一个点覆盖:如果一条边左右端点都不在点覆盖集里面,则左端点是未标记点,右端点是标记点:如果这条边是匹配边的话,右端点想要被标记必须由左端点标记之后走匹配边标记到右端点,所以对于匹配边来说,要不然两端点都被标记,要不然都不被标记;如果这条边不是匹配边的话,右端点被标记之后会走未匹配边标记左端点。所以不会存在这种情况,其为一个点覆盖。
- 最小点覆盖的点的个数下界为最大匹配数,因为想要覆盖匹配边就需要最大匹配数个点,还有未匹配边要覆盖,所以点集大小不会比最大匹配数更小。
- 证明这样得到的点集大小是最大匹配数个:
- 对于匹配边,要不然两端点都被标记,要不然都不被标记,这样每一个匹配边都会唯一对应一个覆盖点,匹配边上的覆盖点也都会唯一对应上这条匹配边。
- 对于非匹配边来说,如果其右端点是标记点,使得左右端点都打上了标记,那么左端点是覆盖点也一定是匹配点,要不然就找到了一条增广路;如果其右端点不是标记点,其一定为覆盖点,也一定是匹配点,因为如果不是匹配点就会作为路径起点而被标记。这样就说明覆盖点和匹配边构成了一组双射,覆盖点的个数即为匹配边的个数。
感觉我的说明还是比较细致(麻烦),ix35说的就比较简略,但其实细节上自己推推都能推出来。
二分图最大独立集
最大独立集:在图中选出尽量多的点使得其导出子图不含边。
对于任意一张无向图,有如下定理成立:
定理:最大独立集大小与最小点覆盖大小之和等于点数。
任何一组独立集选择状态取反之后都为一组点覆盖(对于一条边,独立集是两端点至多选一个,点覆盖值两端点至少选一个),所以独立集和点覆盖是一一对应的。
二分图是特殊的无向图,所以其在二分图中也是成立的。
应用的话大概就是在一些求最大/最小个数的题目中,通过建模转化成二分图最大独立集/最小点覆盖的问题。比较常见的就是棋盘黑白染色模型。
经典栗题:洛谷 P3355 骑士共存问题,洛谷 P5030 长脖子鹿放置,前者是直接的棋盘黑白染色模型,后者则是需要略微观察找出二分图的棋盘模型。
二分图最小边覆盖
最小边覆盖:用最少的边覆盖所有的点。
定理:最小边覆盖大小等于最大独立集大小
考虑最小边覆盖的下界:由于最大独立集两两之间没有边相连,所以一条边至多能覆盖掉最大独立集中的一个点,所以最小边覆盖大小 \(\geq\) 最大独立集大小。
构造得到这个下界:先选出所有的匹配边,对于所有的未匹配点,选出任意一条与之相连的边,这样一共选了总点数减去最大匹配数条边,即为最大独立集大小。
有向无环图最小路径覆盖
给定简单 DAG,我们要选出其中数目最小的(经过的点)不相交的路径,使得每个点至少在一条路径上。
对于 DAG \(G=(V,E)\),构造二分图 \(H\),其中 \(H\) 左右各 \(|V|\) 个点,如果 \((x,y)\in E\),则将 \(H\) 左侧编号为 \(x\) 的点和右侧编号为 \(y\) 的点相连。
定理:DAG \(G\) 的最小路径覆盖大小等于 \(|V|\) 减去 \(H\) 的最大匹配数。
现在构造对 \(G\) 的路径覆盖和 \(H\) 的匹配构造一个双射:
- 对于 \(G\) 的一个路径覆盖,考虑一条路径 \(v_0,v_1,...,v_k\),则在 \(H\) 中将左侧的 \(v_i\) 和右侧的 \(v_{i+1}\) 匹配。由于路径两两不相交,所以每个点的入度和出度 \(\leq 1\),所以选出来的是一个匹配。
- 对于 \(H\) 的一组匹配,用类似的方法得到 \(G\) 的一个路径覆盖:初始时每个点都没有边经过,视为一条空的路径经过,对于每一个匹配边,在 \(G\) 中将其左侧点作为终点的路径拼接上其右侧点作为起点的路径。这样不会出现冲突,因为由于其为一个匹配,所以如果一个点被作为起(终)点拼接,它不会给另外一个点作为起(终)点拼接。
观察将 \(H\) 的匹配映射到 \(G\) 的路径覆盖的过程中,每一个匹配边都会使得 \(G\) 中的两条路径合并,那么 \(H\) 的最大匹配得到的就是 \(G\) 的最小路径覆盖。合并了 \(x\) 次,那么 \(G\) 中路径覆盖大小就是 \(|V|-x\),定理得证。
栗题:[CTSC 2008] 祭祀
给定简单有向无环图 \(G=(V,E)\),求最大的 \(A\subseteq V\) 使得 \(\forall x,y\in A\),不存在 \(x\) 到 \(y\) 的路径。
\(|V|\leq 100,|E|\leq 1000\)
将 DAG 传递闭包后得到一个偏序集,即如果 \(a\) 可以到达 \(b\) 则 \(a\leq b\).根据 Dilworth 定理,最长反链长度(两两不可比的最大集合)等于最小链划分大小(划分成尽量少的两两可比的集合),所以答案即为传递闭包后的最小路径覆盖大小。
二分图最大权匹配
费用流做法
建立源点 \(s\) 和 汇点 \(t\),\(s\) 向每个左部点连流量为 \(1\),费用为 \(0\),每个右部点向 \(t\) 连流量为 \(1\),费用为 \(0\),二分图上的边都是左部点向右部点连流量为 \(1\),费用为权值,求出最大费用最大流即为最大权匹配。
Hall 定理
对于二分图 \(G=(V,E)\),令 \(N(v)\) 表示与点 \(v\) 相邻的点集,则关于最大匹配,我们有如下结论:
Hall 定理:设二分图 \(G\) 的两部分别为 \(X,Y\) 且 \(|X|\leq |Y|\),则其存在一个大小为 \(|X|\) 的匹配(存在完美匹配)当且仅当 \(\forall S\subseteq X\),有 \(|S|\leq |\bigcup\limits_{v\in S} N(v)|\).
必要性(显然):\(S\) 中连出去的边数不足需要的边数,也就是\(|\bigcup\limits_{v\in S} N(v)|<|S|\),那么一定不会存在完美匹配。
充分性:假设最大匹配不是完美匹配,那么左部点集合 \(X\) 中至少有一个未匹配点 \(x\),从这个 \(x\) 开始尝试走增广路,维护左部点集合 \(S\) 和右部点集合 \(T\):
- 每次走到一个新的 \(x\),加进 \(S\) 中,由于满足 Hall 定理条件,\(x\) 一定有一个相邻的点 \(y\),满足其不在 \(T\) 中。如果其为未匹配点,则找到增广路,和最大匹配的假设矛盾;否则,将 \(y\) 加进 \(T\) 中,对于 \(y\) 的匹配点 \(x'\) 递归判断。
\(S\) 每次都会加进去一个新的点,而总的点数是有限的,所以最终一定会推得矛盾,充分性得证,则 Hall 定理得证。
Hall 定理的简单推论:
推论:若一个无向图每个点度数都为 \(k\),则称其为 \(k\) 正则图,那么左右点数相等的 \(k\) 正则二分图必有完美匹配(\(k\ge 1\)).
证明:则考虑任意一个左部点集 \(L\),若不满足 Hall 定理,其所有的点的邻居组成的集合 \(R\) 满足 \(|R|<|L|\),\(R\) 和 \(L\) 之间的边共有 \(|L|\times k\) 条,所以 \(R\) 的度数和 \(|R|\times k\geq |L|\times k\);又由于 \(|R|<|L|\),则 \(|R|\times k< |L|\times k\),推得矛盾。所以这张图满足 Hall 定理,有完美匹配。
Hall 定理推广:设二分图 \(G\) 的两部分别为 \(X,Y\),则其最大匹配为 \(|X|-\max(|S|-|\bigcup\limits_{v\in S} N(v)|)\).
证明和 Hall 定理类似:
设 \(f(S)=|S|-|\bigcup\limits_{v\in S} N(v)|\).
必要性:对于任意一个 \(S\),其至少有 \(f(S)\) 个点不能匹配,则整张图至少有 \(\max (f(S))\) 个点不能匹配。设其为 \(k\).
充分性:假设最大匹配 \(<|X|-k\) 也就是最大匹配中有 \(>k\) 个左部点是非匹配点,对于其中任意的 \((k+1)\) 个非匹配点构成的集合 \(S\),尝试从这些点开始走增广路,维护左部点集合 \(S\) 和右部点集合 \(T\),不断递归进行以下操作:
- 由于 \(|S|-|\bigcup\limits_{v\in S} N(v)|\leq k\),所以至少存在一个右部点 \(y\) 满足其不在 \(T\) 中。若 \(y\) 是非匹配点,则找到一个增广路,与最大匹配的假设矛盾;否则将 \(y\) 加进 \(T\),对于和 \(y\) 匹配的点 \(x'\),加进 \(S\),递归判断。
每次都会加进一个新的点,而点数是有限的,所以最终会推出矛盾。充分性得证,则结论得证。
网络流
网络
对于一个有向图 \(G=(V,E)\),每条边 \((u,v)\in E\) 都有一个权值 \(c(u,v)\),称之为容量,当 \((u,v)\notin E\) 的时候 \(c(u,v)=0\),有两个特殊的点,称之为源点 \(s\in V\),和汇点 \(t\in V\),其中 \(s\neq t\).
流
设 \(f(u,v)\) 定义在二元组 \((u\in V,v\in V)\) 上的实数函数满足:
- 容量限制:\(f(u,v)\leq c(u,v)\);
- 斜对称性:\(f(u,v)=-f(v,u)\);
- 流守恒性:\(\forall x\in V-\{s,t\},\sum_{u,x\sin E}f(u,x)=\sum_{(x,v)\in E}f(x,v)\).
称 \(f\) 为网络 \(G\) 的流函数,整个网络的流量即为从源点出发的所有流量之和。
最大流 费用流 最小割
具体的做法众所周知,于是就不写了!
记一下复杂度:
求解最大流复杂度
Dinic 最坏复杂度为 \(\mathcal{O}(n^2m)\),事实上远远达不到这个上界。
对于求解类似二分图匹配问题时,所有边的流量均为 \(1\),且除了源点和汇点外的所有点,都满足入边最多只有一条,或出边最多只有一条,这样的网络称之为单位网络,对于单位网络 Dinic 复杂度为 \(\mathcal{O}(\sqrt nm)\).
求解费用流复杂度
SSP 算法:最坏 \(\mathcal{O}(nmf)\) 复杂度,其中 \(f\) 是最大流。
定理:最小割等于将每条边的代价转换成其容量后 \(s\) 至 \(t\) 的最大流。
首先先将 \(s\) 无法到达的点和无法到达 \(t\) 的点删去,不影响最大流和最小割的值。
对于一组割,将 \(V\) 分成两个不相交子集 \(L,R\),其中 \(L\) 为 \(s\) 能流到的点集,\(R\) 为能流到 \(t\) 的点集,\(\{(u,v)|u\in L,\in R\}\) 一定是一组割,而且任意割一定能找到一个子集可以表示为这种形式。所以最小割一定可以表示成这种形式。
由于任意流都需要从 \(L\) 到 \(R\),必须经过这些边,所以任意流 \(\leq\) 任意割。
对于最大流,将残量网络上的点分成 \(s\) 能到达的点集 \(L\),以及 \(L\) 的补集 \(R\)。则 \(\{(u,v)|u\in L,v\in R\}\) 一定都是满流的,其构成一组割,此时最大流 \(\geq\) 这组割。又由于任意流 \(\leq\) 任意割,所以这组割是最小割。
最小割的方案
在做完最大流之后求出残量网络中 \(s\) 可以到达的点集 \(L\),其余的点构成的集合为 \(R\),则所有 \((u,v)\) 满足 \(u\in L,v\in R\),则所有的 \((u,v)\) 构成了一组最小割。
但是最小割可能存在很多种,我们定义一条边为可行边为存在一组最小割使得这条边被割断,必经边定义为在每组最小割中这条边都被割断。
考虑暴力判断每一条边:
- 若删掉 \((u,v,w)\) 这条边,最小割的大小减少 \(w\),则这条边是可行边;
- 若将 \((u,v,w)\) 这条边权值改为 \(+\infty\),最小割变大,则这条边是必经边。
考虑更快地判断,在 \(G\) 跑完最大流的残量网络 \(G'\) 上讨论:
命题:一条边 \((u,v,w)\) 是最小割可行边,当且仅当这条边满流,并且 \(G'\) 上不存在 \(u\to v\) 的路径。
- 若不满流,退掉的流 \(< w\),再加上有可能还会有增广路,那么最小割大小减少的量一定 \(<w\);
- 若满流且 \(G'\) 存在 \(u\to v\) 的路径,那么将这条边删掉之后还会有增广路,最小割大小减小的量 \(<w\);
- 同理,若满流且 \(G'\) 不存在 \(u\to v\) 的路径,将这条边删掉之后没有增广路,最小割大小减小的量 \(=w\),其为可行边。
命题:一条边 \((u,v,w)\) 是最小割必经边,当且仅当 \(G'\) 上存在 \(s\to u\) 和 \(v\to t\) 的路径。
其实网上找到的命题还要满足满流,我想了一下如果 \(G'\) 上存在 \(s\to u\) 和 \(v\to t\) 的路径,那么这条边一定满流,否则就出现了一条增广路。
注意到若满足此条件,将 \((u,v,w)\) 这条边权值改为 \(+\infty\),产生增广路,最小割变大,则这条边是必经边。
定理:将 \(G'\) 进行缩点,则边 \((u,v,w)\) 是可行边当且仅当满流且 \(u,v\) 在不同 SCC,是必经边当且仅当满流且 \(s,u\) 在同一 SCC,且 \(v,t\) 在同一 SCC。
这里的 \(G'\) 是指将残量网络中没有满流的边视作有向边,也就是删掉已经满流的边。
证明的话利用反向边讨论即可:
- 若 \((u,v,w)\) 满流,那么其反向边 \(v\to u\) 存在于 \(G'\) 中,则存在 \(u\) 到 \(v\) 的路径等价于 \(u,v\) 在同一 SCC。所以边 \((u,v,w)\) 是可行边当且仅当满流且 \(u,v\) 在不同 SCC;
- 若 \((u,v,w)\) 满流,说明一定存在 \(s\to u\) 的流,其路径上的反向边在其中,所以 \(G'\) 存在 \(u\to s\) 的路径,那么 \(G'\) 存在 \(s\to u\) 的路径等价于 \(s\) 和 \(u\) 在同一 SCC 中。同理,\(G'\) 存在 \(v\to t\) 的路径等价于 \(v\) 和 \(t\) 在同一 SCC 中。
综上,定理得证。
根据以上定理,可以得到以下判断最小割方案的方式:
求出最大流,在残量网络上进行缩点,连接不同 SCC 的满流边是可行边,连接 \(s\) 所在 SCC 和 \(t\) 所在 SCC 的满流边是必经边。
也就是 [AHOI2009]最小割。
二分图最大匹配方案与可行边(点)必经边(点)
感觉没什么用,就不记了。遇到再来补。
最小割求最大权闭合子图
定义:有一个有向图,每一个点都有一个权值(可以为正或负或 \(0\)),选择一个权值和最大的子图,使得每个点的后继都在子图里面,这个子图就叫最大权闭合子图。
转化成最小割问题:
建立超级源点 \(s\) 和汇点 \(t\).
\(s\) 向每个正权点连边,流量为权值的绝对值。这条边存在代表该点在所选子图中。
每个负权点向 \(t\) 连边,流量为权值的绝对值。这条边存在代表该点不在所选子图中。
原图边的流量均为 \(+\infty\) (不能被割掉)。
求该网络的最小割,即可求出最大权闭合子图包含哪些点。
最大权闭合子图的权值 \(=\) 正权和 \(-\) 最小割。
合法性
当 \(s\) 和 \(t\) 连通时,选出的子图不满足条件。假设有一条增广路,\(s\to i\to \ldots \to j\to t\),则 \(i\) 被选中,\(j\) 没有被选中,不符合限制。
当 \(s\) 和 \(t\) 不连通时,选出的子图满足条件。对于任意一个 \(s\to i\):
-
\(i\) 的后继负节点到 \(t\) 的边被割掉了,它们被选中了;
-
由于已经割掉了 \(i\) 的所有后继负节点,\(i\) 的后继正节点一定无法走到 \(t\),割掉它们与 \(s\) 的边是不优的,最小割不会把它们割掉,所以 \(i\) 的所有后继正节点都被选中了。
最优性
根据前面的讨论,任意一个合法的割都对应着唯一一个选点方案;任意一个合法的选点方案都对应着唯一一个割。
这样任意一个割和选点方案都组成了一个双射。由于一个选点方案的权值 \(=\) 正权和 \(-\) 割的大小。
所以最大权闭合子图的权值 \(=\) 正权和 \(-\) 最小割。
上下界网络流
上下界顾名思义就是对于每条边流过的流量,不仅有上界 \(c(u,v)\),还存在下界 \(b(u,v)\)(至少要流过多少流量)。也就是流函数 \(f\) 要满足 \(b(u,v)\leq f(u,v)\leq c(u,v)\).
可以有以下分类:
- 无源汇和有源汇:因为有上下界,所以网络可以保持流量平衡而没有源点和汇点,这一类成为无源汇上下界网络流。
- 可行流,最大流,最小流,费用流。
无源汇上下界可行流
给定一张上下界网络图,求一种合法的流量函数,使得每个点都满足流量守恒。
考虑将其转化成无下界即普通的最大流问题。
对于每一条边,假装其流了 \(b(u,v)\),那么剩余能流的就是 \(c'(u,v)=c(u,v)-b(u,v)\),但是这样流量不一定守恒,于是考虑每个点 \(x\) 出流量与入流量的差 \(M\),并建立超级源点 \(S\) 和 \(T\):若 \(M=0\),则出入流量已经守恒;若 \(M>0\),出流量太多了,需要一定的入流量来平衡,于是连边 \((S,x,M)\);若 \(M<0\),入流量太多了,需要一定的出流量来平衡,于是连边 \((x,T,-M)\).
这样求出 \(S\) 到 \(T\) 的最大流,如果新加的边是满流,就说明这个点可以保持流量平衡,否则就不能保持流量平衡。若所有点都保持流量平衡即求出一个可行流,否则不存在可行流。
有源汇上下界可行流
添加一条边 \((t,s,+\infty)\) 即可转化成无源汇上下界可行流。
有源汇上下界最大流
看看有没有可行流,如果有的话删掉所有附加边在残量网络上再跑一次最大流(这次只有上界了),将可行流和最大流相加即为答案。
不会证明正确性,也没找到。
也可以二分答案,将 \(t\to s\) 的边下界设为 \(m\) 转成可行流问题。
有源汇上下界最小流
类似最大流,考虑将残量网络中不需要的流退掉,在残量网络上跑一次 \(t\) 到 \(s\) 的最大流,将可行流减去最大流即为答案。
不会证明正确性,也没找到。同理也可以二分答案。
有(无)上下界最小(大)费用可行(最大)流
和上面的都一样,把最大流换成费用流。
有负环的费用流
对于价值为负数的边 \((u,v,c,w)\),先假装这条边流满了,答案费用加上 \(c\times w\),然后建反边 \((v,u,c,−w)\),这样就都是正权边了。
但是流量可能不平衡,那就用上下界网络流的思想建立超级源点 \(S\) 和超级汇点 \(T\),和多流出或者多流入的点连边即可。
如果原问题是有源汇无源汇,流量有无下界,进一步的解决方法和之前讨论到的都是一样的。
终于把基础的东西都写完了,待补的还有二分图最大权匹配的KM算法,这个感觉还用不到,也有可能是没什么用,等以后再学吧。