由《NOI2008志愿者招募》来看网络流(费用流)优化线性规划的一类问题

0

在用网络流解线性规划前,我们需要明白网络流本质上是一个什么样的线性规划?

网络流的每条边的流量相当于一个未知数(x)(0<=x<=这条边的流量上限)

网络流中除了超级源和超级汇的点都满足流量守恒,也就是(sum x_{流入}=sum x_{流出}),就是线性规划中的等式。

通常情况下,我们要使(x)的带权和最小,所以每条边还有个费用。

1

noi2008志愿者招募:

申奥成功后,布布经过不懈努力,终于成为奥组委下属公司人力资源部门的主管。布布刚上任就遇到了一个难题:为即将启动的奥运新项目招募一批短期志愿者。经过估算,这个项目需要N 天才能完成,其中第i 天至少需要Ai 个人。布布通过了解得知,一共有M 类志愿者可以招募。其中第i 类可以从第Si 天工作到第Ti 天,招募费用是每人Ci 元。新官上任三把火,为了出色地完成自己的工作,布布希望用尽量少的费用招募足够的志愿者,但这并不是他的特长!于是布布找到了你,希望你帮他设计一种最优的招募方案。

1 ≤ N ≤ 1000,1 ≤ M ≤ 10000

考虑设第(i)类志愿者用了(x[i])个。

对第(j)天,有需求:
(sum x[i]*[s[i]<=j<=t[i]]>=A[i])

不等式不是很能网络流,我们添加变量(a[i]>=0)把不等式变成等式:
(sum x[i]*[s[i]<=j<=t[i]]-a[i]=A[i])

这样一共得到了(n)条等式,设第(j)条方程为(B[j])

(B)差分后,我们会发现,每一个(x[i])只会出现在两条方程中,即第(s[i])条和(t[i]+1)条,第(s[i])条中的系数是(+1),第(t[i]+1)条中的系数是(-1)

把每条方程看做一个点,对每个(x[i]),让系数为+1的地方向系数为-1的地方连边,容量上限是无限,因为这题(x[i])可以无限大,费用即是(c[i])

对添加的变量同样如此。

对每条方程(j),等式右边还有一个系数,设它为(y),此系数的意义是流出-流入,所以当(y>0)(S->j, r = y)

(y<0,j->T,r-y)

最后跑最大流最小费用即可,即用费用流去解线性规划。

【BZOJ4842】[Neerc2016]Delight for a Cat:

这题和上题几乎没有差别,就是(x[i])有了上限而已。

JZOJ6476【GDOI2020模拟02.19】A :

这题是树上版本的,同理对方程做树上差分(每个点的方程减去儿子的),可以让(x[i])只出现在两个方程中。

这样做最后得到图和上下界费用流转换后的图一毛一样。

2

https://www.cnblogs.com/Houjikan/p/4379345.html

这篇博客讲了最小割去解线性规划。

这种思想比较局限,直接能解的问题非常少。

面对复杂的最小割问题时还不如直接想。

我就找到一个这么搞的:

URAL 1833|Hopes of Rowing|最小割

https://blog.csdn.net/huanghongxun/article/details/82943321

但这个题也可以直接想最小割的,比较套路。

3

https://wenku.baidu.com/view/8ea84889d4d8d15abe234eb6.html

这篇ppt的意思是网络流搞线性规划,可是说的不详细。

最后的6道题目按它的意思都可以用上面的方法搞出来,就是没有解析。

我发现确实都可以,但是有些题真的不如直接上。

原文地址:https://www.cnblogs.com/coldchair/p/12343576.html