传送门
这题也是真恶心……
题目大意是俩公司要运货,每条路有容量上限。然后B公司手里有p个……(技能点?)如果在一条路上放了x个技能点,这条路经过了y个货物,那么B公司就会收x*y的钱。现在要求的是,B公司最大获利和A公司在付费最大时的最小值,和这个问题完全倒过来。
首先有一个结论是B公司一定会把所有技能点一股脑全放在流量最大的那条边上。(贪心显然)注意是当前图上的流量而不是原图容量。那么这个问题就转化成了有上/下界限制的最大最小流。对于第一个问题,我们二分一个流的上界,首先判断这个其实就相当于一个正常的网络流,直接跑dinic即可,然后记录一下是否与一开始跑出来的值是相等的,这样二分求最大值即可。(答案就是当前容量上限的最大值*p)
而对于第二个问题,我们二分流的下界。这个时候就是一个有上下界的网络流,要建立辅助源汇点那一套跑流。不过具体的二分操作依然没变。注意的是,如果在二分过程中,当前的下届大于原来的上界,就直接返回0.最后我们求出最小的下界,然后用它乘以p来更新答案。
但是这题坑点很多的……首先是因为这题重构图很多,注意不能大量用memset。还有就是在head复制的时候不要复制少了,辅助源汇点编号不要小了(因为这题S,T)是给定的……,还有就是这次在判断最小流的时候……删除辅助源汇点最稳妥的做法是把其head设为-1,这样可以保证不会跑到。(不知道为啥,这次如果像以前一样把源汇点直接连的边设为不可走会GG……)
看一下代码吧。
#include
#include
#include
#include
#include
#include
#include
#include