由《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道题目按它的意思都可以用上面的方法搞出来,就是没有解析。

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

posted @ 2020-02-21 22:55  Cold_Chair  阅读(309)  评论(0编辑  收藏  举报