图论新结

来源:互联网 发布:ubuntu 查看gpu型号 编辑:程序博客网 时间:2024/06/06 21:00

             无向图最大流(最小割):   只需要加边的时候AddEdge(u, v, w, rw);w正向边cap,rw是反向边cap就可以了。

             最小割(最小的割边数):

                      方法一:把割边上界设为1,非割边流量设为边数+1(也可以INF,但注意INF相加溢出),然后再跑一边最小割就是最小割边数。

                      方法二:原边上界设为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时可用!!!)。

               例题:hdu 4862 Jump

0 0
原创粉丝点击