上下界网络流笔记
在学习上下界网络流之前,首先应该把自己对网络流的认识上升到抽象层面。
让我们回到基础概念:
在有向图 \(G=(V,E)\) 中,用 \(c(u,v)\) 表示边的容量,\(f(u,v)\) 表示边的流量。
可行流即函数 \(f:E\to \mathbb R\) 满足
- 容量限制:\(0\le f(u,v)\le c_{u,v}\)
- 流量守恒:\(\forall u,\sum_{(u,v)\in E} f(u,v)=\sum_{(v,u)\in E}f(v,u)\)
当然,如果没有别的限制,\(f(u,v)=0\) 就是一个可行流。
我们稍稍改一改流量守恒,要求:\(\forall u,\sum_{(u,v)\in E}f(u,v)-\sum_{(v,u)\in E} f(v,u)=a_u\),如果给出 \(a_u\),怎么跑出一个可行流呢?
先考虑 \(a_u>0\),这意味着流入它的流量小于流出它的流量。如果强行把流入它的流量加上 \(a_u\),它才能满足正常的流量守恒。这也很好做到,建立超级源点,向它连权值为 \(a_u\) 的边。
\(a_u<0\) 时同样的,找个超级汇点连出去。
这时容易发现,跑最大流就能得到一个解。
接下来考虑把流量限制拿去改,改成 \(0\le l_{u,v}\le f(u,v)\le r_{u,v}\),即流量限制在给出的区间 \([l_{u,v},r_{u,v}]\) 内,怎么做?
令 \(f'(u,v)=f(u,v)-l_{u,v}\),则 \(0\le f'(u,v)\le r_{u,v}-l_{u,v}\)。假如把 \(f'\) 作为流量,易得 \(f'\) 是满足上述的修改过的流量守恒的,因此转为了上一个问题。
理解了这些以后,上下界网络流的各种 模板 都非常简单了。
浙公网安备 33010602011771号