线性规划约束条件中如果每个变量在且只在两个约束条件中出现,并且系数为+1、-1,则可构造出网络流模型。
题意:战线看作长度为n的序列,现在需要在这个序列上建塔,在i号位置上建一座塔有 ci 花费。有m限制,每个限制形如区间[ li , ri ]中至少有 di 个塔。求最小花费。
内容太长,先说网络流建图方法:
先搞s、t,再加n+2个结点(为了方便,前后各加一个),i向i+1连边,容量无穷,费用0;
对于题目中给出的m个限制,
li−1
向
ri
连边,容量无穷,费用
di
;
s向i连容量为
ci+1
的边,费用0;i向t连容量为
ci
的边,费用0;
跑最大费用最大流
思路:
设
si
为前i个位置塔的数量。
可以得到:
目标函数(最小化):
∑i=1n(si−si−1)∗ci
约束条件:sri−sli−1≥disi−si−1≥0si≥0
到这里,单纯形已经可搞啦!
注意到每个约束条件只有两个变量出现,并且是+1和-1,单纯形直接忽略了这个特性。
为了构造网络流模型,要先对原问题求对偶:
设
pri,li−1
表示第一个约束条件对应的变量,
qi,i−1
表示第二个约束条件对应的变量。
得到:
目标函数(最大化)
∑i=1npri,li−1∗di
约束条件qi,i−1−qi+1,i+∑jpi,j−∑jpj,i≤ci−ci+1q,p≥0
将等式看作点,将变量看作边。由于每个变量只在两个等式出现,一正一负,恰好表示流入和流出。
把约束条件表示成松弛形式
上面这个等式,表示的是结点i,一次考虑每个变量来建边。
考虑q:i-1向i连边,费用0,容量无穷。
考虑p:对于每个题目给出的
ri,li,di
,
li−1
向
ri
连边,费用
di
,容量无穷。
考虑常数c:i向t连边,费用0,容量
ci
并且设定流量下界
ci
;s向i连边,费用0,容量
ci+1
并且设定流量下界
ci+1
考虑a:i向t连边,费用0,容量无穷。
显然答案会在最大流时取到。
于是就可以用带上下界的 最大费用最大流求解了!
但是建图可以更优。
对于对偶后得到的约束条件,如果把他们左边右边全部叠加起来,会得到
0≤0
。这说明为了满足约束条件,所有“
≤
”必须取等号。即,在松弛形式中的a,始终等于0。所以关于a的边是没有必要的。
对于常数c,对应的边都是连向s和t的。s的所有出边的容量和为
∑ci
,t的所有入边也是
∑ci
,只要该问题有解(肯定有解),最大流时就一定满足下界的限制。所以下界可以去掉。
于是就可以用最大费用最大流求解啦!