【笔记】图论:网络流与二分图理论

原“欧拉回路 / 欧拉路径”部分 moved to https://www.cnblogs.com/caijianhong/p/18322272

配套的习题可见 https://www.cnblogs.com/caijianhong/p/18332022

网络流的求法

https://www.cnblogs.com/caijianhong/p/16863491.html

网络流扩展

复杂度分析

  • Dinic 的复杂度上界为 \(O(n^2m)\)
    • 但是特殊情况下会更快,如二分图匹配(或者说所有边的流量为 \(1\))是 \(O((n+m)\sqrt m)\) 的;
    • 确定流量上限 \(f\) 时,复杂度为 \(O((n+m)f)\)
  • 最小费用最大流的复杂度上界为 \(O(nmf)\)
    • 注意,单路增广和多路增广没有复杂度区别(指费用流),后者只是常数优化。
    • 无论哪一种写法,当前弧优化都是必要的,否则复杂度错误。

建图

  • 多源汇:建立超级源点和汇点。
  • \(u\) 自带流量 \(w\):连边 \((S,u)=w\)
  • \(u\) 最终需要接受流量 \(w\):连边 \((u,T)=w\)
  • 经过点 \(u\) 有容量限制 \(w\):将这个点拆成 \(u,u'\),一个入点(连边 \((v,u)\)),一个出点(连边 \((u',v)\)),中间连 \((u,u')=w\)
  • 无向图:连两条有向边(现在你有了四条边)。

无源汇上下界可行流

这个图是无源汇的,那么可行流在这里指:每个点都流量平衡。

对于所有边 \(u\to v\) 带有 \([l,r]\) 的流量限制,使得 \(u\) 点强制流出 \(l\)\(v\) 点强制流入 \(l\),记录每个点的流入和流出,流入减流出记为 \(d_u\)。这个时候是不满足流量平衡的,拿出超级源汇 \(S,T\),枚举点 \(u\),如果 \(d_u>0\) 就是流入更多,那么使它流出,\(u\to T\) 需要流 \(d_u\);反之流出更多,使它平衡,\(S\to u\) 需要流 \(-d_u\)

将每条边的流量限制改为 \(r-l\),并对所有边添加反向边(就正常反悔边),以 \(S\) 为源点,\(T\) 为汇点,跑最大流。如果 \(S\) 连出的点没有满流(由于 \(S,T\) 流量相等,\(T\) 流入的边也没有满流),则没有可行流;否则这就是一个可行流。

有源汇上下界可行流

  1. 设原图的源汇为 \(s,t\)\(t\to s\) 连接容量 \(\infty\) 的边。
  2. 进行无源汇上下界可行流。

有源汇上下界最大/小流

  1. 跑一遍有源汇上下界可行流,如果没有就真的没有了。
  2. 删除 \(t\to s\) 的巨大无比的边。
  3. 删除 \(S,T\) 连出的流量平衡边。
  4. 对于最大流,以 \(s\) 为源点,\(t\) 为汇点,在当前残量网络上跑最大流。
  5. 对于最小流,以 \(t\) 为源点,\(s\) 为汇点,在当前残量网络上跑最大流。

最小割及应用

这一部分建议直接参考其他文章如 https://www.luogu.com/blog/ix-35/noi-yi-lun-fu-xi-i-er-fen-tu-wang-lao-liu

定义

在网络图 \(G=(V,E)\) 中,割被定义为一种点集的划分方式:将所有的点划分成两个集合 \(s,t\),满足 \(s\cup t=V,s\cap t=\varnothing,S\in s,T\in t\)。这个割的权值被定义为 \(\forall(u,v)\in E,u\in s,v\in t\)\(w(u,v)\) 之和。

最大流-最小割定理

最大流-最小割定理:在任意网络中,最大流等于最小割。

最小割方案

用你喜欢的最大流算法跑出一个最大流,沿着残量网络从 \(S\) 找到的点就属于点集 \(S\)

最小割模型分类

集合划分

若点 \(u\) 最终在 \(s\) 所能到达的点(即 \(S\) 集),点 \(v\) 最终在 \(s\)能到达的点(即 \(T\) 集)时,将产生代价 \(w\),则连边 \(u\to v\),边权 \(w\)

边权 \(w =\infty\) 时,说明 \(u\in S, v\in T\) 这个事情不能发生。

连通性

例题 [ZJOI2009] 狼和羊的故事、CF1517G Starry Night Camping。可以感受一下!

这一种就不太关心边权具体是什么,你只管连,让它割断就好了。

转最大流

题目让你求最小割,你改成求最大流,从最大流的角度思考,或者反过来。注意一个题目要么用最大流方式思考,要么用最小割方式思考,这两者都涉及一点连通性的讨论,但是想法完全不同。最大流和最小割只有数值相等的关系,建最小割的图时不能按照网络流思想建。

模型 1:最大权闭合子图(集合划分)

我们说一个有向图是一张图的闭合子图,那么:

  • 它是一个有向图的子图;
  • 如果一个点在闭合子图中,它在原图中的所有出边指向的点都在这张新的闭合子图中。

那么最大权闭合子图就是权值和最大的子图。

建图方法:正权点连 \(S\),负权点(点权取反后)连 \(T\),其他边保留为无穷大,答案是正权点之和 - 最小割。所选的点集是 \(S\)

模型 2:奖励模型(集合划分 / 连通性)

\(n\) 个物品,买下第 \(i\) 个物品需要 \(cost_i\),不买第 \(i\) 个物品需要花费 \(pay_i\),如果同时买了 \(u,v\) 则奖励 \(money_{u,v}\),如果同时不买 \(u,v\) 也奖励 \(orz_{u,v}\),求最大获利。

\(m=\sum_i cost_i+\sum_{u,v} money_{u,v}+\sum_{u,v} orz_{u,v}\)。我们最终答案 \(=\) \(m\) \(-\) 最小割。

每个物品建一个点。注意我们割掉哪条边就代表我们不选这个决策。假如我们说 \(S\) 连向这个点是 \(pay_i\),这个点连向 \(T\)\(cost_i\),就是说我们割掉左边就是买(归 \(T\) 集),割掉右边就是不买(归 \(S\) 集)。

然后建奖励点:

  • 同时买 \(u,v\):建点 \(P\)\(\{u,v\} \to P\to T\),其中 \(P\to T\) 的权值是 \(money_{u,v}\),另外两条边是 \(\infty\)

    • 解释:\(u, v\) 有一个归 \(S\) 集时需要支付这个代价,会在答案中被减掉。
  • 同时不买 \(u,v\):建点 \(P\)\(S\to P\to \{u,v\}\),其中 \(S\to P\) 的权值是 \(orz_{u,v}\),另外两条边是 \(\infty\)

    • 解释:\(u, v\) 有一个归 \(T\) 集时需要支付这个代价,也会在答案中被减掉。
    • 或者也可以说:只有某一侧的边全部割掉,它们对应的另一侧的奖励点才能保留,才不会被减掉。

模型 3:切糕模型(集合划分)

形式 1:\(n\) 个变量 \(m\) 种取值。\(q\) 个形如【不可以同时满足 \(x_i\geq a\)\(x_j\leq b\)】的条件。求一组解,或者求权值和最小的解。

形式 2:有若干变量 \(x_1, x_2, \cdots, x_n\),有函数 \(f(i, v)\) 为当 \(x_i=v\) 时的代价。另外可以对 \(x_i, x_j\) 做限制,可以当 \(x_i\geq u\)\(x_j\leq v\) 时有一个代价(左下限制),也可以 \(x_i\leq u\)\(x_j\geq v\) 时有一个代价(右上限制)。可以求最小总代价。

对于一个变量的所有取值开一条链,这些限制相当于一条链到另一条链的边,然后最小割。

这里需要形式化:

  • 规定 \(x_i=1\sim v\) 如果归了 \(S\) 集,\(x_i=v+1\sim m\) 归了 \(T\) 集,就表示取得 \(x_i=v\)\(x_i\) 的值域是 \([1, m]\))。
  • 故对 \(x_i=v\) 这个状态建一个点,将其向 \(x_i=v+1\)\(T\) 连边(看具体情况),边权是 \(f(i, v)\)
  • 对限制 \(x_i\geq u\land x_j\leq v\) 时有一个代价 \(c\),意思是 \(x_i=1\sim u\)\(S\) 集且 \(x_j=v+1\sim m\)\(T\) 集时需要付出 \(c\) 的代价,那么直接从 \(x_i=u\)\(x_j=v+1\)\(c\) 的边。
  • 为了避免一些情况,确保第一条规定成立,可以考虑从 \(x_i=v\)\(x_i=v-1\) 连一条 \(\infty\) 的边。但是听说不加也没有事,不知道为什么。

平面图最小割定理

平面图是一个图,若存在某种在平面上画出图的方式,使得边与边只在顶点相交的图,被称为平面图

对于一个平面图,都有其对应的对偶图

  • 平面图被划分出的每一个区域当作对偶图的一个点;
  • 平面图中的每一条边两边的区域对应的点用边相连,特别地,若两边为同一区域则加一条回边(自环)。

这样构成的图即为原平面图的对偶图。

有定理:平面图最小割等于对偶图最短路。

二分图相关

定义

  • 图的最大团:是图的一个最大的点集 \(V\),满足 \(\forall i,j\in V\)\(i,j\) 之间边。
  • 图的最大独立集:是图的一个最大的点集 \(V\),满足 \(\forall i,j\in V\)\(i,j\) 之间没有边。
  • 图的最小点覆盖:是图的一个最小的点集 \(V\),满足对于每一条边,它的两端至少有一端在 \(V\) 中。
  • 图的最大匹配:是图的一个最大的边集 \(E\),满足对于每一个点,这个点至多有一条边集中的边与它相连。
  • 图的最小边覆盖:是图的一个最小的边集 \(E\),满足对于每一个点,至少有一条边 \(e\in E\) 使得这个点是 \(e\) 的一端。
  • DAG 的最小路径覆盖:是 DAG 的一个点不相交路径集合 \(L\),每个点都在恰好一条路径上。
  • DAG 的最小链覆盖:是 DAG 的一个链组成的集合 \(L\),点可以相交,即每个点都在至少一条链上。
  • DAG 的最长反链:是 DAG 的一个点集 \(V\),满足点集中任意两点不可达。

注:市面上称 DAG 最小路径覆盖和最小链覆盖是同一个问题,这个问题下面分出路径(或链)是否可以相交。这里将这两个问题细分,具体定义见上。

定理

  • 一般图:图的最大团 \(=\) 补图的最大独立集。

  • 一般图:最大独立集 \(+\) 最小点覆盖 \(=\) \(n\)

    • 最大独立集是最小点覆盖的补集。
  • 一般图:最小边覆盖 \(+\) 最大匹配数 \(=\) \(n\)

    • 这两个的方案可以互相转换,互相删删增增。
    • 如从最大匹配到最小边覆盖:跑出最大匹配后,看看没有匹配的点,它一定连向的都是匹配点,随意选一个连接匹配点的边计入答案。
  • Hall 定理(二分图):二分图存在完美匹配,当且仅当,对于所有左部点 \(S\) 都有 \(|nxt(S)|\geq |S|\)

    • 其中 \(nxt(u)\)\(u\) 的出边指向的右部点集合,\(nxt(S)=\bigcup_{u\in S}nxt(u)\)
    • Hall 定理推论:左部点集为 \(U\) 的二分图的最大匹配是 \(|U|-\max_{S\subseteq U}\{|S|-|N(S)|\}\)\(S\) 可以为空。
  • Kőnig 定理(二分图):最小点覆盖 \(=\) 最大匹配。

    • 最小点覆盖的方案是:从左部每个非匹配点出发,再执行一次 dfs 寻找增广路的过程(一定会失败),标记访问过的节点。取左部未被标记的点、右部被标记的点,就得到了二分图最小点覆盖。
    • 推论:在二分图中,最大独立集 \(=\) 最小边覆盖 \(=\) \(n\) \(-\) 最小点覆盖 \(=\) \(n\) \(-\) 最大匹配。
  • DAG:最小路径覆盖 \(=n\ -\) 拆点二分图最大匹配。

    • 将每个点拆成入点和出点。连边:\(\forall (u,v)\in E,out_u\to inn_v\)。等价表述是建立左右部都有 \(n\) 个点的二分图,对于原图的边 \(u\to v\),将左部点 \(u\) 向右部点 \(v\) 连边。
    • 然后跑二分图最大匹配。方案就是最大匹配。
    • 原因:这相当于一开始有 \(n\) 个点,每个点都用一条长度为 \(1\) 的路径覆盖。然后考虑尽可能多的合并路径。
  • DAG:最小链覆盖 \(=\) 传递闭包的最小路径覆盖。

    • 对 DAG 求传递闭包。图的传递闭包是一个图,原图中若 \(u\) 能到达 \(v\) 则传递闭包中 \(u\)\(v\) 有连边。
    • 对传递闭包求最小路径覆盖。
    • 相当于用传递闭包去除了不相交的限制,原图相交的路径在传递闭包上可以直接“跨过去”。
  • Dilworth 定理(DAG):最长反链 \(=\) 最小链覆盖。

Kőnig 定理证明

(以下内容来自《算法竞赛进阶指南》李煜东)

定理:二分图最小点覆盖 = 二分图最大匹配。

证明:首先,因为最大匹配是原二分图边集的一个子集,并且所有边都不相交,所以至少需要从每条匹配边中选出一个端点。因此,最小点覆盖包含的点数不可能小于最大匹配包含的边数。如果能对任意二分图构造出一组点覆盖,其包含的点数等于最大匹配包含的边数,那么定理就能得证。构造方法如下:

  1. 求出二分图最大匹配;
  2. 从左部每个非匹配点出发,再执行一次 dfs 寻找增广路的过程(一定会失败),标记访问过的节点;
  3. 左部未被标记的点、右部被标记的点,就得到了二分图最小点覆盖。

下面证明该构造的正确性。经过上述构造方法后:

  1. 左部非匹配点一定都被标记——因为它们是出发点;
  2. 右部非匹配点一定都没被标记——否则就找到了增广路;
  3. 一对匹配点要么都被标记,要么都没被标记——因为在寻找增广路的过程中,左部匹配点只能通过右部到达。

在构造中,我们取了左部未被标记的点,右部被标记的点。根据上面的讨论可以发现,恰好是每条匹配边取了一个点,所以选出的点数等于最大匹配包含的边数。

再来讨论这种取法是否覆盖了所有的边:

  1. 匹配边一定被覆盖——因为恰好有一个端点被取走;
  2. 不存在连接两个非匹配点的边——否则就有长度为 \(1\) 的增广路了;
  3. 连接左部非匹配点 \(i\),右部匹配点 \(j\) 的边——因为 \(i\) 是出发点,所以 \(j\) 一定被访问,而我们取了右部所有被标记的点,因此这样的边也被覆盖;
  4. 连接左部匹配点 \(i\),右部非匹配点 \(j\) 的边——\(i\) 一定没有被访问,否则再走到 \(j\) 就找到了增广路。而我们取了左部所有未被标记的点,因此这样的边也被覆盖。

证毕

posted @ 2023-08-03 17:11  caijianhong  阅读(125)  评论(0编辑  收藏  举报