【最小割输出方案】 残量网络DFS,跑出S能到达的点集A,割=(A,V-A)
【最小费用任意流】(最大类似) 增广路的费用>=0时停止增广。
【顶点限流】 拆点
【费用分段递增】 拆边
【最小点割集】
图G中 删去一些点使得 '这些点的权值和最小' 且满足 '从点S走不到点T'。
将G中每个点v 拆成v1,v2 add(v1,v2,val[v]);
对于G中每条有向边(u,v) add(u2,v1,inf); (无向就add无向边)
源是S2 汇是T1 求最小割、
割边e(v1,v2),就是意味点v是要删去的点(当然 方案数不唯一)
【最大权闭合子图】
图G中 若u->v,则选了u必须选v, add(u,v,inf)
对于w(u)>0的,add(S,u,w(u)); 对于w(u)<0的,add(u,T,-w(u));
Ans=(正权和) - (S->T的最小割)
【上下界网络流】
1. 无源汇可行流 (也叫可行循环流) 判是否可行
新建 s0,t0,判断每个点v的(入边的下界和-出边的下界和=w ,大于0,则s0向v连w的边,小于0,则v向t0连-w的边。 然后跑s0->t0最大流,满流则可行
2. 有源汇最大流
原图的T向S连 上界inf 下界0的边。然后先当成无源汇可行流那样做……跑出可行流之后,存下S->T这条边的流量,然后删掉S-T这条边,删除s0,t0。再跑S->T的最大流,加上之前存下的S->T的流量
3. 有源汇最小流
反例在这个博客里有。https://www.cnblogs.com/kane0526/archive/2013/04/05/3001108.html
先不加T向S的inf边,直接按无源汇可行流的方法跑s0->t0的最大流。再加T向S的inf边,继续跑s0->t0的最大流。最后的T->S的流量就是可行最小流。
先不加T向S的inf边,是为了将原图中的循环流尽可能利用上,分担T->S这条inf边的流量。这样就能得到最小流了。
【区间K覆盖】
指 在区间[1,n] 中 选择 若干个有价值的区间[l,r],要求重叠的区间不超过K层,最大化价值
转换成网络流就是,把每个区间当成流,要求最大流=最小割<=K
建模: S -> 1 -> 2 -> 3 -> ... -> n -> T ,其中每条边 流量为K,费用为0
然后对于每一个区间 [l,r] ,add(l,r,1,-val) 跑费用流即可。
1、如果要求重叠在每个点上的不超过K层, 拆点即可
2、如果要求整个区间的n-1个段 分别被恰好覆盖ai层,可以将对应的 i -> i+1 边 流量改为 上下界都为K-ai (这里的K取 max(ai)即可 。)