网络流模型小结
最近网络流题做得算是比较多了,有许多类似的模型,这里做一下总结:
1.0
最大权闭合子图
这种模型最经典的是noi2006最大获利,模型就是一些有依赖关系的点,权值有正有负,拿了一个就要拿它的所有后继节点,然后求一个最大的权值。方法是保留原图中的边,容量定位无穷,对于每个正权点,S向它连权值容量的边;对于每个负权点,它想T连权值绝对值容量的边,跑一边最小割,最后答案就是用所有正权减去最大流。详细的讲解请看amber的那篇经典论文《最小割模型在信息学竞赛中的应用》。这里我说一下求方案的问题。由于我们选出来的点是求完各割以后与S点都属于相连的集合,所以从S点跑一边dfs就行了。类似的问题还有POJ3155 Harelife(01分规),POJ2987 Firing(求方案),NOI2009植物大战僵尸(需要tarjan缩环)。
2.0
有访问顺序的费用流
有的时候我会碰到这种问题,就是给你一堆点让你按照顺序把他们每个都访问一边,例如ZJOI2012 皮卡丘、SDOI2010 星际竞速,或者是一天一天按时间顺着走,例如24题里面那个餐巾问题(bzoj 上叫软件开发)。
如果就按着题意想的话,很难直接地从图上构造出"顺序"这个约束条件,我们不如打破"顺序"的思维定式,这样考虑:这些问题的共同点是每一个点都要被访问!所以流量这一维常常是作为每个点都访问一遍的限制的:实现的话就是用每个点的访问量作为到汇点的边的容量来限制,由于是求最大流,那么这些边一定会满流。
然后我们所以我们只要考虑它是怎么来的。拿星际竞速那个题来说吧,由于每个点只能走比它标号大的点,所以点i的来源之一是从比它标号小的点j通过直接相连的边走来的。另外每个点可以直接"跳"到,于是i的第二个来源是从某个点"跳"过来(我们不用考虑是从谁跳来的,只要知道能跳到就行了)。对于餐巾那个题,每一天的毛巾的来源就是前面几天的和新买的。于是对于这几种不同的来源,我们用费用去刻画它们:如果跟其他点无关,我们可以直接从源点向它们引边(反正最后到达汇点的流量一定),如果和其他点有关,那就按照原题的描述,从其他点向它流。不同的来源费用不同,体现了不同的抉择的优劣不同。
有必要提一下皮卡丘那个题对于顺序的刻画,我们用floyd来求出从每个点出发不经过超过k的到每个点的最短路,这样就可以刻画出所有情况的来源了,也就解决了顺序问题。可见这种看似动态的问题,我们可以静态地来分析构造。
3.0
区间和点的费用流
这一类问题是对于每个区间或者点有着各种各样的约束啊,费用啊~~~栗子就是最最经典的employee那个题(话说第一次做的时候看题解那一堆线性规划式子简直要晕死了)。不过说实话,这种题用线性规划来搞还是要好理解许多。我这个菜鸟就不在这里献丑了,byvoid大神的博客都里写的很清楚了。我只说一下我自己的心得吧:
刚开始做这种题的时候很容易就想到把人建一排点,把天建一排点,其实这是没学过线性规划把变量和约束条件混为一谈了。如果用线性规划来分析的话,这二者一个是边一个是点,相互之间可以转化。对于employee这个题,我们把天当做约束条件,因为要满足每天的需求;而把人当做变量,因为雇佣不同人花费不同,这样一看清晰许多。而最近看了ZJOI 2013 防守战线 那个题突然就明白了对偶性该怎么用。就是当我们正面运用线性规划不好刻画或不好构造的时候,就可以用对偶性来转化成一个相反的问题(具体说就是原来的约束变成变量,变量变成约束,求最小变成求最大,你会发现点和边完全倒置了,非常非常神奇)。对于线性规划式子的处理:我们只要构造流守恒式子就行了,就是每个变量正负在所有式子中各出现一次,这个要具体问题具体分析了。
对于ZJOI 2013 防守战线那个题我有点不明白就是zkw怎么求不出最大费用流,难道是我写错了吗,还是有什么高级的变形???
类似的还有POJ 3680 这是区间管点和上面那个挺像。
4.0
一种关于图的度数费用流
例题是WC2007的石头剪刀布。这个题有点神啊,题意是让你给图中加有向边,使得点两两有边,问最多能凑出多少个环。这个题我们要考虑每个点的度数,因为图中的边是一定的,于是入度和也是一定的,于是列出一个什么式子: ans=C(n,3)-∑C(di,2) (di为i的入度)然后变形得到:ans=C(n,3)-(∑di^2)/2+∑di/2,于是需要最小化的就是∑di^2。这是一个二维费用,怎么办呢?拆边!把边拆成1,3,5,7......他们的前缀和一定是一个完全平方数,由于跑最小费用流的时候一定是先找到最小的费用边,所以一定能满足费用是完全平方数。
关于这类题还有一种混合图的欧拉路问题,也是根据点的度来搞。
5.0
最小割的妙用
给一个图问给某些条边加/减多少能使得指定的边成为最大/最小生成树上的边。最小割问题,因为mst上相同边权的边数目一定,于是问题变成了判断需要改变多少才能使得指定边在其环上不是最差的边。
还有个求一条边是不是可能再最小割上,是不是一定在最小割上。方法是:求最大流,对残余网络求强连通。枚举每条满流边(u,v),如果u和v在不同连通块,则该边可为最小割边,如果u和s同连通块且v和t同连通块,则该边定为最小割边。至于为什么,amber论文上说满流边不一定是割边,还要看它的两端是不是在一个集合,因为最小割把原图分成S,T两个集合了,如果这条边沟通两个集合,那么一定是最小割边。
还有网格图的最小割问题:比如bzoj第一页的第二题狼爪兔子还有NOI20120的海拔,很容易想到最小割,但要拿到满分一定不能用最大流算法。我们转化成其对偶图的最短路,求这个快多了。但是建对偶图可不是那么容易的,折腾了好久......
最后还有个在最短路图上跑最小割的题,AHOI2006的上学路线,先用spfa把在最短路上的边都标记上,然后在这个图上跑最小割。
先写到这里,以后有什么想到的再加上好了。