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