觉得写得很好,学习一下。原文传送门http://blog.leanote.com/post/mrazer/%E7%BD%91%E7%BB%9C%E6%B5%81%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0
巧妙运用拆点与拆边。
在流模型中(若为出边):
容量设为+∞:让水流不要在这里卡住,来者不拒,你给我来多少我都能给你输送出去,也就是让这个点随便流出,只限制流入。
容量设为1:让水流专门卡在这里,不管你给我来多少,很抱歉,只有一条能从这里经过,严格限制流出,怎么选最优,你自己去调整吧,反正只能流出去一条。此时往往与“限制”联系在一起,如某个动作只能执行一次(比赛只能举行一次,只能有一个人赢得比赛,只能有一个人匹配成功等等。)
在割模型中:
容量设为+∞:不许给我割这条边,爱割哪几条自己选去,反正不能是这条。(用容量设为+∞来排除不参与决策的边)
容量设为1:常常用于求“个数”的问题(比如二分图匹配之类的),因为这时候得到的最大流=最小割=对应的满流的个数=某某的个数(比如在二分图匹配中就是指匹配上的点的个数)(这时常常只把需要求解个数的部分容量设为1而其余部分容量为+∞,表示必须并且只能割这一部分)
由于原网络流中某一条边总是与它的反向边同时添加,所以可以去掉rev数组,用x^1来表示编号为x的边的反向边(边的标号要从2开始,即加边前编号要设为1)。
考虑题目有没有阶段性,如有可以按阶段来建模,一个阶段在同一列。
先稍微直观、复杂一点建模,然后可以考虑合并和删点等来简化模型与问题。
规律1:如果几个结点的流量的来源完全相同,则可以把它们合并成一个。
规律2:如果几个结点的流量的去向完全相同,则可以把它们合并成一个。
规律3:如果从点u到点v有一条容量为∞的边,并且点v除了点u以外没有别的流量来源,则可以把这两个节点合并成一个。
如果题目中有对于某一个结点几个量相等这一条件,可以考虑运用“流量守恒定律”。
如果对于一个结点有多个属性和性质,可以考虑拆点。
跟比赛有关时常常要运用网络流,s连比赛,比赛连选手,选手连t,并且此时往往考察是否有满流(POJ2699)。
供应、分配性问题一般建模:s连供应,供应连人,人连t,并把容量都设为1。(注意多种供应时,比如同时提供食物和饮料,这时可以把人放在中间,供应放在两边建模,并拆点来限制只能有一条流入,即对于每个人也有限制容量为1)
注意动态流问题,即一边增加某一个变量(如时间),一边加点,问题往往有明显的阶段性(SGU438)。
没有明确思路时,可以先考虑相似模型、类型的题目,尝试通过改变容量来转到这道题上。
删边使s和t不连通:直接求最小割。删点使s和t不连通:把每个点拆成两个点并连一条容量为1的边,原图中的边容量设为+∞,然后求最小割(显然此时强制只能删点)。
有时一定要回到定义中去:割可以十分直接的象征“关系的决裂”“两点的分离”等。
在“投票”问题中常常用到最小割(有两种选择):属于s视为投赞成票,属于t视为投反对票。
由于在最小割模型中答案为割边容量之和,所以有时容量即为选这条边可以得到的分值。
最小费用流如果为分段收费,那么可以通过拆边的方式来解决。
如果费用函数不是分段线性的(如a*flow^2),该如何做?
枚举流量为0, 1, 2, …,cap,计算对应的费用cost[0], cost[1], cost[2], …,cost[cap],然后依次加入容量都为1,费用分别为cost[0], cost[1]-cost[0], cost[2]-cost[1]-cost[0], …的边。最小费用流以及费用函数的凸性保证了流一定会先充满费用较小的边,再流向费用较大的边,而这些费用的和正好等于流量为x时的总费用,是正确的流。
在费用流里可以用费用为-v来表示收益为v(如果为点收益则可以拆点)。
对于网络流无向边的情况(容量表示这条边来回经过次数的总和):拆点。假设原先从u到v容量为w(无向),那么就添加一个点o,添边如下:(u,v,w),(v,o,w),(o,u,w)。注意这是一个有向环,根据流量守恒定律,它跟原先的无向边是等价的。
倘若决策方式很多,一定要想想有没有必要拆点。
运用与源或汇相连的边来处理点权。
二分图最小点权覆盖集(点覆盖边):s到x和y到t容量都设为该点的权值,原图中边容量设为+∞,求最小割即可。
二分图最大点权独立集=总权值-最小点权覆盖集。
最小点权覆盖集:对于(u,v)∈E,保证(u属于V1)or(v属于V1)。
最大点权独立集:对于(u,v)∈E,保证(u不属于V1)or(v不属于V1)。
最大化一个值有时需要转化成“总权值-最小割”(此时边权容量对应权值)。
1:最大匹配数+最大独立集=|X|+|Y|
2:二分图的最小覆盖数=最大匹配数
3:最小路径覆盖=最大独立集
点的最小路径覆盖(每个点被且仅被某一条路径覆盖一次):n-二分图最大匹配,uu拆点为uu和u′u′对于(u,v)(u,v),连边(u,v′)(u,v′),理解。
边的最小路径覆盖(每条边被且仅被某一条路径覆盖一次):相当于每条边都至少走一次,所以直接跑有下界的网络流即可。
好题:Rivendell学长课件中的题、志愿者招募。