Ford-Fulkerson算法 java实现
2015-10-22 18:48
134 查看
/*
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函数)需要尤其注意。
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,顶部为top static int ver; static int edge; static int ford_Fulkerson(int s,int t){ //res默认初始化为0 int 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; //找到目标节点,返回true stack[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)); } }
相关文章推荐
- Java集合类详解之例子
- NLPIR/ICTCLAS中文分词系统 java相关api文档总结
- 推荐几个高质量的博客
- Eclipse选中一个变量名,相同变量都变色显示设置
- Java实现经纬度格式转化
- Unsupported major.minor version 51.0错误
- java部分关键字
- Java反射学习和笔记——黑马训练营
- java 时间相关操作
- java,awt,中文方框,中文乱码
- 将Eclipse项目转化为Android项目,并且做到结构兼容
- 浅谈Java多线程编程中Boolean常量的同步问题
- java转义字符
- Java_BigDecimal类型比较大小
- Java集合框架之Collection学习和笔记——黑马训练营
- 深入解析Java编程中的boolean对象的运用
- Spring MVC异常处理详解
- eclipse中Maven运行时报错: -Dmaven.multiModuleProjectDirectory system propery is not set. Check $M2_HOME environment variable and mvn script match.
- java Date、String、Long三种日期类型相互转换
- eclipse复制粘贴卡死