Ford-Fulkerson算法 java实现
来源:互联网 发布:电子相册软件免费 编辑:程序博客网 时间:2024/05/29 14:28
/*
for each edge(u,v) 属于 G,E
(u,v).f = 0;
while there exists a path p from s to t in the residual network Gf
cf(p) = min{cf(u,v):(u,v) is in p};
for each edge(u,v) in p
if(u,v)属于E
(u,v).f += cf(p)
else
(u,v).f -= cf(p);
*/
用数组实现栈来进行深度遍历的地方(dfs函数)需要尤其注意。
import java.util.*;class Ford_Fulkerson{static int[][] res;//残留矩阵static int[] pre;static boolean[] used;static int[] stack; //用于dfs,底部为0,顶部为topstatic int ver;static int edge;static int ford_Fulkerson(int s,int t){//res默认初始化为0int cfp = Integer.MAX_VALUE;int maxflow = 0;while(dfs(s,t)){int d = Integer.MAX_VALUE;for(int i = t; i != s; i = pre[i]) d = Math.min(d, res[pre[i]][i]); for(int i=t; i != s; i = pre[i]) { res[pre[i]][i] -= d; res[i][pre[i]] += d; }maxflow += d;}return maxflow;}static boolean dfs(int s ,int t){for(int i=0;i<=ver;i++) used[i] = false;used[s] = true;int top = 0;stack[0] = s; top++;int cur = s,i = 1;int[] rec = new int[ver+5]; //记录第i个节点遍历到的位置boolean flag = false;//采用非递归的形式,找到一条增广路径后立刻终止while(top != 0){ //stack 不为空flag = false;cur = stack[top-1]; //相当于peek操作for(i=rec[cur]+1;i <= ver;i++){//取与其相邻的并且没有访问过的值大于0的点入栈if(used[i]|| res[cur][i] <= 0) continue;flag = true;pre[i] = cur;used[i] = true;if(i == t) return true; //找到目标节点,返回truestack[top++] = i;//入栈rec[cur] = i;break;}////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////if(!flag) {used[stack[--top]] = false;}//回溯过程恢复设置,并pop}return false;}static void init(){res = new int[ver+5][ver+5];used = new boolean[ver+5];pre = new int[ver+5];stack = new int[ver+5];}static void input(){Scanner cin = new Scanner(System.in);System.out.println("请输入 点数 边数");ver = cin.nextInt();edge = cin.nextInt();int s,e,w;init();System.out.println("起点 终点 权值");for(int i=0;i<edge;i++){s = cin.nextInt();e = cin.nextInt();w = cin.nextInt();res[s][e] = w;}}public static void main(String[] args){input();System.out.println(ford_Fulkerson(1,4));}}
1 0
- Ford-Fulkerson算法 java实现
- Ford-Fulkerson算法求最大流Java实现
- 算法实现(1):Ford-Fulkerson Algorithm
- Ford Fulkerson 算法
- 网络流算法--Ford-Fulkerson方法及其多种实现
- 7. 网络流算法--Ford-Fulkerson方法及其多种实现
- 最大流算法--Ford-Fulkerson方法及其多种实现
- [图论]最大流介绍 Ford-Fulkerson算法 邻接表实现
- 网络流算法--Ford-Fulkerson方法及其多种实现
- 最大流问题-Ford-Fulkerson算法 C++极简实现
- 网络流算法--FORD-FULKERSON方法及其多种实现
- Ford-Fulkerson算法的效率
- 最大流 Ford-Fulkerson算法
- 网络流--ford-fulkerson算法
- Ford-Fulkerson Edmonds-Karp算法
- 增广路算法Ford-Fulkerson
- Ford-Fulkerson
- Ford-Fulkerson
- GO语言教程(一)Linux( Centos)下Go的安装, 以及HelloWorld
- ftp 文件断点续传
- 队列的顺序表示和实现
- [JS]js判断值是否为空的代码写法示例
- Java集合类详解之例子
- Ford-Fulkerson算法 java实现
- make: *** /lib/modules/2.6.32-573.7.1.el6.x86_64/build/: No such file or directory. Stop.
- Android studio gradle 生成字段属性值
- android应用无法连接到bmob云端解决方案
- HDU 杭电5477 A Sweet Journey
- AFN上传图片
- 【开发纪事】 微信公共帐号
- Ext JS 学习&Tips
- POJ ——3069 Saruman's Army