以志愿者招募为例。
看一下样例,设x[i]为第i类志愿者招募数,p[i]为志愿者招募数量,得到:
p[1]=x[1]>=2
p[2]=x[1]+x[2]>=3
p[3]=x[2]+x[3]>=4
把下面的不等式转化为等式,设y[i]为第i天多招募的数量,可以化为:
p[1]=x[1]-y[1]=2
p[2]=x[1]+x[2]-y[2]=3
p[3]=x[2]+x[3]-y[3]=4
x[i]>=0,y[i]>=0
令p[0]=p[4]=0,把p差分一下,得到
p[1]-p[0]=x[1]-y[1]=2
p[2]-p[1]=x[2]-y[2]+y[1]=1
p[3]-p[2]=x[3]-y[3]-x[1]+y[2]=1
p[4]-p[3]=y[3]-x[2]-x[3]=-4
x[i]>=0,y[i]>=0
要求最小化y[i]*c[i]
可以建一个网络流图,把每个等式看成一个点(其实恰好就是流量平衡),每个变量看做一条边(解决了费用问题)
如果把正数看做流入,负数代表流出,则可以得到下面的建图方法:
如果p[i]-p[i-1]>0,从s->i连(p[i]-p[i-1],0),否则i->t连(p[i-1]-p[i],0)
i+1->i连(inf,0)
对于每类志愿者,s[i]->t[i]+1连(inf,c[i])
总结:如果有若干个0<=x<=p且每个式子出现恰好2次,且一次为+1一次为-1,可以用费用流解线性规划。
在机场中,限制从>=变成<=,把i+1->i连(inf,0)变成i->i+1连(inf,0)即可。