无向图最大流(最小割): 只需要加边的时候AddEdge(u, v, w, rw);w正向边cap,rw是反向边cap就可以了。
最小割(最小的割边数):
方法一:把割边上界设为1,非割边流量设为边数+1(也可以INF,但注意INF相加溢出),然后再跑一边最小割就是最小割边数。(有bug??)
方法二:原边上界设为c*m+1(m为边数),跑一边最大流,则maxflow / m 即为割大小,maxflow%m即为最小的割边数
最小K路径覆盖的模型(有向无环图):
方法一:用费用流或者KM算法解决,构造二部图,X部有N个节点,源点向X部每个节点连一条边,流量1,费用0,Y部有N个节点,每个节点向汇点连一条边,流
量1,费用0,如果X部的节点x可以在一步之内到达Y部的节点y,那么就连边x->y,(如果需要费用,则表示的是边费用),流量1,再在X部增加一个新的节点,表示可以从
任意节点出发K次,源点向其连边,费用0,流量K,这个点向Y部每个点连边,费用0,流量1,最这个图跑最小费用最大流,如果满流就是存在解,反之不存在,最小费用的相反数就是可以获得的最大能量。
方法二:费用流的不同建图方法。把每个点u拆点为u,u‘,源点s到任意点u连一条流量为1,费用为0的边,任意点u'到汇点t连一条流量为1费用为0的边。然后u到u'点连一条流量为1(表示点只被使用一次),费用为MOD(大于可能求得的最大费用),然后对于所有边(u, v),连点u到点v'的边,流量为1,费用为边的费用。最后建立超级源点ss,连一条ss到s的边,流量为k,费用为0(表示可以有k条路),最后跑一边最大费用最大流,设最后费用为cost。那么cost/MOD == N说明可以找到有向无环图的k路径,cost%MOD就是最终答案获得费用最大值(只有当最优费用大于等于0时可用!!!)。