1、 容量网络、残留网络、层次网络;
2、 增广路、前向弧、后向弧、网络流、割;
3、 弧的容量、流量;
4、 距离标号、活跃顶点、盈余、推进;
5、 可行流、预流、最大流、可改进量、最小割。
6、 拆点、路径压缩、最短路、DFS、BFS、二分搜索。
一、网络最大流
1、 一般增广路算法(Generic Augmenting Path)
2、 最短增广路算法(Shortest Augmenting Path)
3、 连续最短增广路算法——Dinic算法(Successive Shortest Augmenting Path Algorithm)
4、 一般预流推进算法(Generic Preflow-Push Algorithm)
5、 最高标号预流推进算法(Highest-Label Preflow-Push Algorithm)
6、 SAP算法
二、最小割的求解
1、 先求得最大流,然后依次枚举。
枚举思路:
1) 枚举一条边,并计算没有这条边的最大流,如最大流减少,则删去此边,记下此时的最大流,否则,不删边,枚举下一条边;这样反复枚举,计算,记录,直到最后最大流变为0.枚举结束,求得最小割的边。
2) 枚举一个点,并计算失去这个点的最大流,如最大流减少,则删去此点,并记下次时的最大流,否则,不删点,枚举下一个点;这样反复枚举,直至最大流为0.枚举结束,求得最少删去的点数。
这种思路简单,但要多次求最大流,容易超时。
2、 先求得最大流,然后DFS优先搜索历遍。
深搜思路:
在残余网络中从原点Vs出发进行DFS,历遍到的顶点做标记(条件为该边的残留容量不为0),这些点构成集合S,其余顶点构成顶点T。然后连接SàT的所有前向弧(后向弧也是饱和的,这不过它的正流量为0,所以不统计),这些弧的残留为0,也就是说这些弧是饱和的。
这种方法使用DFS完成,也可改用BFS,来求得最小割边集合,所用的时间相对较少。
三、流量有上下界的网络最大流和最小流
1、 网络:原始网络(Arc:上界、下届、流量)、伴随网络(Acc:上界、下届、流量)。
2、 Acc的构建:增加一个新的起点S,新的终点T;定点i 的入度 u 大于出度 v 时,增加一条S à i 的边,容量为u-v;相反,增加一条i à T 的边,容量为v-u;其它边的容量皆为上界 - 下界。
当S à 各点的流量都满载时,存在可行流。
3、求原网络的可行流:Acc的流量 + Arc 的流量下界。
4、构建有可行流后的残留网络(网络中弧的容量为:流量上界 – 可行流量),然后求解该网络的最大流,最
后与可行流相加就是最大流;求最小流则只要在构建残留网络后,将源点和汇点交换,再求最大流,最后结果的相反值就是最小流。
网上有种Vt à Vs 连边的一种简易方式求最大最小流,使用二分搜索,详细参见:http://wenku.baidu.com/view/0f3b691c59eef8c75fbfb35c.html
四、最小费用最大流(最大流不唯一的情况)
1、 先使用floyd求出任意两点间的最短距离,再求出网络最大流,然后使用二分法设置两点间最长距离的限制,以此为条件重新建立容量网络,求最大流,如最大流减小,则增大距离限制,否则减少,反复操作,直到取到最小的距离(距离最好是整数)。
2、 求得从源点到汇点的一条最短路径(约束条件:该边可流通),然后求出这条路上的增广量;然后反复运行,直到没有一条从源点到达汇点的最短路,得出最大流中的最小费用。
MPLA最短路径增值算法
1、初始化流量,计算出剩余图。
2、根据剩余图计算层次图。若汇点不在层次图内,则算法结束
3、在层次图内不断用bfs增广,知道层次图内没有增广路为止
4、转步骤2
Dinic算法
1、初始化流量,计算出剩余图。
2、根据剩余图计算层次图。若汇点不在层次图内,则算法结束
3、在层次图内用一次dfs过程增广
4、转步骤2
2、 增广路、前向弧、后向弧、网络流、割;
3、 弧的容量、流量;
4、 距离标号、活跃顶点、盈余、推进;
5、 可行流、预流、最大流、可改进量、最小割。
6、 拆点、路径压缩、最短路、DFS、BFS、二分搜索。
一、网络最大流
1、 一般增广路算法(Generic Augmenting Path)
2、 最短增广路算法(Shortest Augmenting Path)
3、 连续最短增广路算法——Dinic算法(Successive Shortest Augmenting Path Algorithm)
4、 一般预流推进算法(Generic Preflow-Push Algorithm)
5、 最高标号预流推进算法(Highest-Label Preflow-Push Algorithm)
6、 SAP算法
二、最小割的求解
1、 先求得最大流,然后依次枚举。
枚举思路:
1) 枚举一条边,并计算没有这条边的最大流,如最大流减少,则删去此边,记下此时的最大流,否则,不删边,枚举下一条边;这样反复枚举,计算,记录,直到最后最大流变为0.枚举结束,求得最小割的边。
2) 枚举一个点,并计算失去这个点的最大流,如最大流减少,则删去此点,并记下次时的最大流,否则,不删点,枚举下一个点;这样反复枚举,直至最大流为0.枚举结束,求得最少删去的点数。
这种思路简单,但要多次求最大流,容易超时。
2、 先求得最大流,然后DFS优先搜索历遍。
深搜思路:
在残余网络中从原点Vs出发进行DFS,历遍到的顶点做标记(条件为该边的残留容量不为0),这些点构成集合S,其余顶点构成顶点T。然后连接SàT的所有前向弧(后向弧也是饱和的,这不过它的正流量为0,所以不统计),这些弧的残留为0,也就是说这些弧是饱和的。
这种方法使用DFS完成,也可改用BFS,来求得最小割边集合,所用的时间相对较少。
三、流量有上下界的网络最大流和最小流
1、 网络:原始网络(Arc:上界、下届、流量)、伴随网络(Acc:上界、下届、流量)。
2、 Acc的构建:增加一个新的起点S,新的终点T;定点i 的入度 u 大于出度 v 时,增加一条S à i 的边,容量为u-v;相反,增加一条i à T 的边,容量为v-u;其它边的容量皆为上界 - 下界。
当S à 各点的流量都满载时,存在可行流。
3、求原网络的可行流:Acc的流量 + Arc 的流量下界。
4、构建有可行流后的残留网络(网络中弧的容量为:流量上界 – 可行流量),然后求解该网络的最大流,最
后与可行流相加就是最大流;求最小流则只要在构建残留网络后,将源点和汇点交换,再求最大流,最后结果的相反值就是最小流。
网上有种Vt à Vs 连边的一种简易方式求最大最小流,使用二分搜索,详细参见:http://wenku.baidu.com/view/0f3b691c59eef8c75fbfb35c.html
四、最小费用最大流(最大流不唯一的情况)
1、 先使用floyd求出任意两点间的最短距离,再求出网络最大流,然后使用二分法设置两点间最长距离的限制,以此为条件重新建立容量网络,求最大流,如最大流减小,则增大距离限制,否则减少,反复操作,直到取到最小的距离(距离最好是整数)。
2、 求得从源点到汇点的一条最短路径(约束条件:该边可流通),然后求出这条路上的增广量;然后反复运行,直到没有一条从源点到达汇点的最短路,得出最大流中的最小费用。
MPLA最短路径增值算法
1、初始化流量,计算出剩余图。
2、根据剩余图计算层次图。若汇点不在层次图内,则算法结束
3、在层次图内不断用bfs增广,知道层次图内没有增广路为止
4、转步骤2
Dinic算法
1、初始化流量,计算出剩余图。
2、根据剩余图计算层次图。若汇点不在层次图内,则算法结束
3、在层次图内用一次dfs过程增广
4、转步骤2