上下界问题
无源汇上下界求有无可行流
另取两个附加汇点xx,附件源点yy.
u->v限制 [ L , R ] [L,R] [L,R] <=>
add_edge(u,xx,L),add_edge(yy,v,L),add_edge(u,v,R-L)
最后只需跑一遍 max_flow(yy,xx)检验与yy相连接的边是否满流即可
有源汇上下界求有无可行流时,只需在无源基础上加上 add_edge(t,s,INF)
有源汇上下界求最大流
第一种
- 连上t->s流量为inf的边,求一次附加源到附加汇的最大流
- 在残量网络上求一次s到t的最大流
- 最后答案就是第二次求出的最大流(因为第一次求出的最大流是t->s的流量,而这个流量在他的反向边s->t中出现,所以不需要另外加上)
- 为什么这样做呢?
- 依然感性的理解,第一次求出的(附加源到附加汇的)最大流是为了满足down尽可能流满,然而此时s->t上可能还有可行的流,我们在残量网络上继续来求最大流,可以使得最后求出的流既满足≥down的限制,且最大。
第二种更易理解
就是将res = t->s流量,将最后一条边删除或cap赋值为零。加上跑一遍s->t的最大流。
有源汇上下界求最小流时
- 先不要连接t->s流量为inf的边,求一次最大流
- 再连上t->s流量为inf的边,在残量网络上求一次最大流
- 为什么这样做呢?
- 感性的来理解,第一步中求最大流,所有能流的边都“竭尽全力”的流完了;
第二步再求最大流的时候,t->s上的流量就会尽可能的小(即s->t的流量尽可能小)
一般技巧
-
如果一个点的经过有时间的先后顺序,那么我们可以利用图的有向性,和时间的有向性,来将其结合起来,将其扩大时间的点数。
-
在已给了一些匹配后,需要我们根据一给出的图给出最少修改次数,此时,就需要我们对原来一些匹配给出优化,就是在相同情况下给出优待,那么怎么给呢,将图的权值扩充为原来最多点数的倍数,而以给出的匹配,我们就在额外将其权值加一,此时,最后得到的最大匹配和再最总点数取余即可得到原来的边数,而将总期望数除以总点数取整,就原有的值。
-
双向图时,可以少建反边。
-
在求含有负权的费用流中,如果不计流量求最小费用,那么我们需要加一条边
add_edge(s,t,INF,0)
这样就跑出的费用一定是最小的。 -
需要把一块图拆成两块区域,即求最小割,也就是最大流。
-
一般图遇到最小路径覆盖时,需要将其拆成二分图也就是这样,跑一边最大流
二分图最小路径覆盖 = 总点数-最大匹配数
V 1 = { x 0 , x 1 , . . . x n } ∪ { y 0 , y 1 , .