该博客整理网络流的常见模型,不建议初学者食用
感谢:本文例题即部分解释来自THU 胡泽聪授课pdf
流量表示变迁
eg1
给定一张的无向图,每条边有长度。点i处有ai头牛,以及一个能容纳bi头
牛的牛棚。牛可以沿边移动,每条边上可以同时有任意头牛经过。一头牛经过
一条边所需时间即为道路长度。
给出一个将牛分配到牛棚的方案,并最小化所需移动时间T。
hint:我们发现这是一个最小值问题,但是不好求,于是我们考率二分答案,显然这是单调的;二分后变成判定性问题;
那么如何解决该判定性问题?网络流!
我们将所有点拆为a与b S连a流量为 ai a i ,b连T流量为 bi b i ,ab间流量为无穷。当当前的二分值为mid时,我们将满足最短路<=mid的两点i,j之间连边 ai−>bj a i − > b j bi−>aj b i − > a j 流量为无穷,当最大流= ∑ni=1ai ∑ i = 1 n a i 时便成立。不拆点会错,为啥?因为我们的连边原则是dis<=mid 但如果直接连到点j而j与k距离是mid 那i与k距离便>mid 所以会出错。
eg2
有m个猪圈,每个猪圈里初始时有若干头猪。一开始所有猪圈都是关闭的。
依次来了n个顾客,每个顾客分别会打开指定的几个猪圈,从中买若干头
猪。
每个顾客分别都有他能够买的数量的上限。
每个顾客走后,他打开的那些猪圈中的猪,都可以被任意地调换到其它开
着的猪圈里,然后所有猪圈重新关上。
问最多总共能卖出多少头猪。
1 ≤ m ≤ 1000、1 ≤ n ≤ 100。
hint:
分开考虑每个猪圈。考虑能对其产生影响的若干顾客。
只有这些顾客才能买,也只有他们才能移动猪圈里的猪。
那么从源向每个猪圈的第一个顾客连边,容量为初始的数量。
每个猪圈的第i个顾客向第i + 1个顾客连边,容量为无穷大。
顾客向T连边 流量为购买能力(正确性交给读者思考)
eg3
有a种食物和b种饮料,每种食物或饮料只能供一头牛享用,且每头牛只享
用一种食物和一种饮料。
现在有n头牛,每头牛都有自己喜欢的食物种类列表和饮料种类列表。
问最多能使几头牛同时享用到自己喜欢的食物和饮料。
hint:
有些同学会想到二分图匹配于是这样的图便有了
那么就有一个十分严重的问题 小学问题:两只牛 最大几个匹配?两个。
在