联赛后按专题刷题,最近是网络流,感觉自己每到刷题时就会很慢,好在最近状态还可以。
然而老夫思考一番决定还是放题解包吧,从题解中寻找思路。
关于最大流:
首先是一些比较基础的方法,如:拆点,先把总的贡献加上再尽量减小(把至少转化成最大)
以及一些建图技巧:奇偶染色,按照某个限制进行拆点,动态加点等
例题:
蜥蜴(基础题,拆点限流
星际战争(与二分结合
奇怪的游戏(奇偶染色
士兵占领(先加贡献,减最大流
紧急疏散(按时间拆点
个人理解:最大流的题难点其实在于建图方式,对转化题意方面要求不高
关于最小割 :
需要一定的转化题意的能力,
首先是类似二分图,对两点间有限制的,如:二选一。可以用最小割解决
其次是可以转化为最大权闭合子图的。
技巧方面,注意数据范围如果很大看能不能转化为对偶图跑最短路
例题:
狼抓兔子&海拔(平面图转对偶图
切糕(可以算是一类模型,用inf边去限制割的边的范围
最大获利&植物大战僵尸&寿司餐厅&employ人员雇佣&线性代数(最大权闭合子图
happiness(用最小割实现一个类似比较大小的过程
另外:最小割树(这玩意我只会板子。。。
个人理解:最小割在某些情况下可以理解为比较大小的过程。(好像就是最大权闭合子图
另外:若可以导出“若i则j,所选权值最大”之类的东西,可以考虑最大权闭合子图
关于费用流(只会spfa
个人觉得从流和费用的实际意义出发考虑问题比较明白
技巧方面,动态建点&边
例题:
修车&美食节&壕游戏:(拆点,动态建点&加边
数字配对&千钧一发:(推式子,二分图黑白染色
上下界网络流:
无源汇可行流:是其他上下界的基础,一定要理解
主要思想是先满足下限,然后根据每个点的流入流出量,新建超级源汇S,T。
向原图中的点连接相应的必需权值的边。
有源汇可行流:在无源汇的基础上,t先s连inf。同时根据实际含义,t向s连边的流量其实就是原图的可行流的流量。
上下界费用流:这玩意其实特别好用,好多费用流的题,若对流量和费用都有限制,可以考虑大力上下界费用流,这样可以避免很多限制,如:星际竞速。
然而还有一个技巧:对于某些上下界费用流的图,可以对每个点拆点,中间连接-inf的费用,最后再减去,这样就可以避免上下界网络流。
所以好像上下界费用流也不咋地。。。
例题:
志愿者招募:按照实际意义分析,考虑对于每种志愿者新建一个点x,从结束日向x连边,从x向起始点连边,含义是有一股流从x出发从起点跑到终点最后在回到x(循环流)然后就可以跑无源汇费用流了,然后你发现新建的点只是作为一个中转站出现的,直接从结束点想起始点连边即可。
旅行时的困惑:100000个点跑上下界???(打个贪心直接溜
80人环游世界&星际竞速:裸的(可以点权-inf搞)
个人理解:上下界网络流其实可以作为一种暴力,用规定上下界的方式对流量进行约束。
upd:对于费用流,若一开始从源点到汇点没有负权边,即所有正的流量都对应正的花费,则可以在spfa中加一句:if(dis[u]>=dis[T])continue;,加上后跑得很快,但我不会证。。。