决心去做好每一道网络流24题,去理解最大流、最小费用流、最小割、……
好好去体验吧,开题!
开始按顺序来写了。
太空飞行计划问题【网络流24题】【最小割】
这道题的精髓在于如果割哪个边,那么最后deep[]会停留在它前面的一个点,那么就可以知道被安排的是哪个点了。
还要强调一点,这个时候千万不能使用判断边的流量和容量来看,只能去判断割点的位置,不然一定会出现偏大或者偏小的情况。
最小路径覆盖问题【网路流24题】【最大流+题意+建边思路】
精髓就是建边的思想,只要想明白怎么建边的话,输入和输出都是很容易的。
同时这道题可以说是这道题的简化版了,这道题就是题意太难理解了,但是说的通俗易懂一些就是,我们最少用几条链,可以覆盖完所有的点?
魔术球问题【网络流24题】【最大流Dinic+隐式图推理+拆点建边】
这是我的第一道隐式图的网络流建边了,因为N最大只有50,所以我们主要是利用了这个原理“最小边覆盖 = 目前的点的总数 - 最大匹配”(有向图的性质之一),然后就能去推这个题了。当然,拆点的方式跟上一题是一样的,不难的。
圆桌问题【网络流24题】【最大流Dinic】
这道题感觉上就是不难了,甚至猜测到是否可以去使用二分匹配来写这道题,那么就由自己看吧,说实话这道算是之前几道中简单的了。
最长不下降子序列问题【网络流24题】【最大流+LIS+思路】
我的天,这道题真的是我在猜了,然后给我瞎推出来的然后胆子一大就交了,然后再特判一下,竟然A了,虽然不敢相信,但是求一个Hack。然后里面还有另外一整套网络流24题的全套的链接,可以点进去学习(我只是拿来尝试被Hack用的)。
试题库问题【网络流24题】【最大流】
这道题比之前的题要简单一些(个人认为),所以具体就是自己去想怎么建边即可,我就不掺和什么了,给大家锻炼自己的机会。
方格取数问题【网络流24题】【最大流+最小割+点覆盖模型】
这道题用到的最小割的思想,的确是有点难想,就是要将求有限制的最大值问题转换成总和-最小割的方式来解决问题。
我们将点分为黑白点,其中,黑点的周围都是白点,同样的,白点的周围的点都是黑点,我们利用这样的方式来解这个问题我们从源点链接到黑点边容量为权值的边,在又白点链接到汇点,为边容量为点权值的边,然后对于每个黑点,链接上每个白点,边权为INF,这样子,我们只需要去求一个最小割即可,我们利用全体点权之和再减去最小割的量得到的就是最后我们需要的最大值了。
餐巾计划问题【网络流24题】【最大流最小费用】
一道普通的最大流最小费用的题,我们需要考虑的是这样的情况:第i天的旧餐巾我们该怎么处理?我们知道可以退后m天去快洗,然后在第i+m天再次使用它花费f元,另外的方法就是在推后n天去慢洗,花费的s元,但是我们要是遇到刚好那天在这段区间内的怎么办,我们不如就加上一组无条件推后一天的情况。
我们就以这样的想法去思考,然后建上对应的边即可。
软件补丁问题【网络流24题】【最短路+状态压缩】
这是一道假的网络流的题目吧,我觉得是跑一遍SPFA即可。我们从满状态(全都是病毒)向0状态(病毒都修复完了)去跑,然后去取最段路即可,如果最后终点的值还是INF,那么就是说明它还是没有跑到终点的办法。
数字梯形问题【网络流24题】【最大流最小费用求最大费用】
挺好的一道题,做这道题一定要找到一个好的测评机,否则,会虚假的过了这道题。
然后讲一下这道超级有意思的网络流最大费用,我们要跑最大费用,用SPFA直接跑?当然是不行的,我们需要改进,这里就是用到了把权值赋为负值,然后再去跑最小费用的思维去处理这个问题。然后关于建边,就要自己去思考了,其实并不是特别的难,可以思考出来的。
负载平衡问题【网络流24题】【最大流最小费用】
注意是环形。
一道费用流,是因为移动每一个货物可以看成是挪动一次代价为1,这样子想就可以建边了,从源点出发到每个节点是每个节点的拥有数,而每个节点到汇点的容量是那个平均数。然后对于每个相邻的节点连接上边并且单位流的代价是1。
运输问题【网络流24题】【最大流最小费用+最大费用】
这是一道简单的模板题啦,在跑最大费用的时候得去考虑将每条边赋为负值,然后再跑最小费用就行了。
骑士共存问题【网络流24题】【最大流最小割+最大独立集】
我联想到的解法是之前做的方格取数问题,都是用到了一样的思路,我们还是一样将点分为两种类型,目的在于区分能相互攻击的分在两边,一边保证了同奇偶,就是为了保证各侧的骑士们都是可以和平共处的骑士们,因为走的图是“日”,所以,保证同奇偶即可。
我们同样的,从偶数点去匹配对应的奇数点,让它们互相冲突的只能存在一个,也就是去计算最多的骑士可以保留的个数。相互冲突的话,只能留其一了。这样子就是最小割的问题了,可以自己思考,也可以看我后面的证明。
我们先简化模型,原题经我们分析相当于有一个二分图(设这两个点集分别为X,Y),我们要在这个二分图选出最多的点,使这些点中任意两个点之间没有边。
而我们要证明的即为,选出最多的点数=原点数-网络最大流
又最大流最小割定理,网络最大流=将源点汇点分开最小割的容量
所以我们将证明转换为了,选出最多点数=原点数-最小割
而我们知道,一个割就是将所有点分割成S和T两个集合,其中s∈S,t∈T
我们不妨假设S∪X即是我们在X中选的点,T∪Y即是我们在Y中选的点
显而易见的,S∪Y即是我们在X中不选的点,T∪X即是我们在Y中不选的点
那我们建inf的边意义即在我们强制了不能同时选的两点必在同一个集合(即为一个不选一个选),因为如果它们不在同一个集合中,割的大小就超过了inf,肯定不会成为最小割
而我们建1的边的意义即在如果X中的点不在S中,或者Y中的点不在T中,就会损失一个点,而损失当然越小越好了
所以可以得到选出最多点数=原点数-最小割,而又由最大流最小割定理,最小割=最大流,就可以跑最大流了。证毕。
这也就是二分图的最大独立集。
深海机器人问题【网络流24题】【最大流最小费用】
这道题的建边倒是不难,但是要想到的是要去建一个从一点到另一点一个流量为INF但是费用为0的边,而有价值的边的时候,我们建立的边就是流量为1,并且费用为负价值的边。
火星探险问题【网络流24题】【最大流最小费用】
处理好东西与南北的关系,然后分别建立单位流的负权价值边和INF流的0价值边,当然,遇到那些不可建边的点还要判断一下,总而言之,跟深海机器人问题解题思路差不多。
汽车加油行驶问题【网络流24题】【单流的最小费用流——最段路SPFA】
若要看成网络流来做的话就是单位流的最小费用流,还不如直接去写SPFA呢。
但是除了SPFA的做法以外,去写BFS的方式也可以做这道题。
[CTSC1999]家园【网络流24题】【最大流+分层图】
我们知道0是起始点,-1是终点,但是由于-1的特殊,我把0看作了N+1,-1看作了N+2来做,那么我们就该去跑时间戳了,每一个时间,飞船就会像公交汽车那样子往后走一格,我们只要让飞船不断的往下走下去即可,但是可能会存在把人放下来让他原地等待下一个别的航班的情况,所以,我们还要对于每个点建立一个原地等待的边,接下去,看到飞船每个时刻都会飞向下一个地点,那么对于该时刻,我们建立这样子的,对于下一个时刻的对应边,容量就是飞船的载客量。
这就是分层图的思想了。
有个细节,就是对于源点和汇点,我们不把它随时间去变化。
最长k可重区间集问题【网络流24题】【最大流最小费用】
我们开始的时候,对所有的点这样考虑,S -> 1 -> 2 -> 3 -> …… -> i -> i+1 -> …… -> T每条边的容量都是K(其实只需要保证1是K后面自动维护的),然后考虑,对于每个开区间,我们完全不需要去考虑对于端点,因为这是开区间,不考虑端点是否会被重复赋值。所以,我们可以这样子去做,对于端点,我们从L端向R端直接建立一条流量为1、边权为区间长度的相反数的流量边。
这个思绪的理解,相当于是替换的思想了,我们把原来的边拿后面更优的边去替换掉,然后用一个类似于差分的思想,在区间内的话,就会外围更好的边去流,不断的就可以去选取到更优的价值(最小费用的原理)。
最长k可重线段集问题【网络流24题】【最大流最小费用】
关于线段的投影的重叠问题,这道题给了一个很好的说明,我们可以想到这样的有竖直的线段、以及其他各种普通的线段。由于是开线段,那么我们就考虑这样一个问题,这是一条竖直的线段,譬如说是x=5这样子的线段,再遇到一条(5, 7)的投影在x上的开区间怎么办?怎么去限流?我们依然是要去限制流出端,但是这里的流出端一个是5,另一个也是5,但是很明显不一样的诶,一个就是在5上,另一个却是不经过5的。
我们得去处理这个问题,怎么处理呢,我们对于投影在x轴上的区间这样处理:(l, r)变换成(l<<1|1, r<<1)。这样子的想法是很有深度的,一下子就帮我们处理完了拆点以及这样子的流出端的问题。
航空路线问题【网络流24题】【最大流最小费用】
这道题一定要去拆点,避免有个点走了两次,然后再考虑链接边,要从低的连接上高的,对于可以链接上的边,我们建立流为1且费用为-1的边权。
然后,就是输出点的问题了,我们可以去跑两次dfs(),第一次我们跑升序的,当然,对于1号点和N号点,我们特殊处理,然后第二次我们跑降序的输出,注意考虑流量的问题。