网络流建模经验

前言

  1. Dinic 的两种基本优化:当前弧优化,多路增广。
  2. 复习时请通读网络流 24 题。
  3. 万物可流。

正文

小技巧

拆点 :最经典的套路了,用来解决一个点最大流量限制。

边转点:最小链覆盖问题如果用网络流硬写就是把边当成一个点来考虑。

无向图:建边时两条边的权值均置为 \(w\)​ 即可。

断流法:[P3227 HNOI2013]切糕 - 洛谷 在这里看到的一个技巧,用于最小割当中。如果在 序列/方形 等模型中出现 "两个点最大/小距离为 \(S\)" 等字样,我们便要考虑用特殊手段断掉这个区间的贡献。操作和理解起来都很容易:image.png

红线区间外的边就被断掉了。

最小割

首先最小割 = 最大流,然后有一个经典模型就是划分问题:给你一个点集 \(S=\{\{a_1,b_1\}\dots\{a_i,b_i\}\}\)​ 和两个集合 \(A,B\)​, 每一个点可以划分入集合之中以获得 \(a_i/b_i\)​ 的权值,问如何划分获得价值最大。

考虑将每一个点都向 \(A\)\(B\) 连边 ( \(A\rightarrow i\),权值为 \(a_i\) ),( \(i\rightarrow B\), 权值为 \(b_i\)) ,由于一个点不可能同时被分到两个集合里面,所以我们要选几条边把它割开使得两个点集不连通,也就是最小割。

最大权闭合图

详情请看国家集训队论文

用来解决依赖问题。(比如大学选课的先决条件

闭合图: 对于图中的任意点出边仍在图中的无环图。

简单割: 割中的边中的一个端点必定为源点或汇点。

详细地说说依赖问题,比如我有两个事件 \(A,B\) ,事件 \(i\) 能带给我 \(V(i)\) 的收益,并且 \(B\) 发生的必要条件是 \(A\)​​​ , 问如何选择获益最大。(注意,权值可能为负数,或者是存在互斥事件,比如上文所说的划分问题

模型转换也很简单,假如 \(A\) 依赖 \(B\) ,那就连一条边 \(A\rightarrow B\), 表示 \(B\)\(A\) 的先决条件,这样就变成了选择闭合图。

闭合图转换成简单割则较为复杂:设立两个虚拟点 \(S,T\) , 对于权值为正的向 \(S\) 连边,边权为权值。权值为负的向 \(T\) 连边,边权为权值。互斥一旁放 \(S\) 一旁放 \(T\)​​。P4313 文理分科 - 洛谷 具体证明可以看看论文。

费用流

如何从最大流到费用流不算太难:

  • 代码层面:套个 spfa
  • 模型层面:多了费用,而题面说的数量大多化成了流量了。

费用流有一个比较普遍特点:你把图建出来后,最大流一般为 \(n\)

这也就是费用流的用途:保证一个单位的流量一定能到达中点,怎么选取最优路径呢?各显神通吧——自行调整

一个我很喜欢的题:CF739E Gosha is hunting

国王球和普通球就是我们的流量,我们明明知道所有的球都会被用,但是却不知道怎么用才是最优的,于是建立网络。

发现两个球同时作用到一个宝可梦的情况很难处理,看看两个球同时用的贡献:发现是 \(A_i + B_i - A_i * B_i\)​ . 于是我们可以对一个宝可梦连出两条通往 \(T\)​ 的边,边权和费用分别为 \(\{1,0\},\{1,-A_i*B_i\}\)​ . 考虑到费用流的自我调整特性,只有一个球用到宝可梦身上时,第二条边肯定不会被用到。

posted @ 2021-08-05 22:06  guodongLovesOi  阅读(74)  评论(0编辑  收藏  举报