do_while_true

一言(ヒトコト)

「学习笔记」二分图和网络流

序言

基本是对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|)\) 内解决问题。

栗题:[HNOI 2019] 校园旅行

给定无向图 \(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)\)

栗题 NOI2009 变换序列

容易把问题转化为给定左部点度数均为 \(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)\) 上的实数函数满足:

  1. 容量限制:\(f(u,v)\leq c(u,v)\)
  2. 斜对称性:\(f(u,v)=-f(v,u)\)
  3. 流守恒性:\(\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算法,这个感觉还用不到,也有可能是没什么用,等以后再学吧。

posted @ 2021-12-20 18:53  do_while_true  阅读(237)  评论(1编辑  收藏  举报