由《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道题目按它的意思都可以用上面的方法搞出来,就是没有解析。
我发现确实都可以,但是有些题真的不如直接上。