Edmonds-Karp算法

最大流算法

参考:http://www.cnblogs.com/jackge/archive/2013/05/05/3061893.html


package test;

import java.util.Arrays;
import java.util.LinkedList;

public class Edmonds_Karp_Test {

	public static void main(String[] args) {
		//输入一个图
		int [][] cap ={  {0,5,0,0,0},
					  	{0,0,6,0,1},
				        {0,0,0,5,2},
				        {0,0,0,0,1},
				        {0,0,0,0,0},
				        };//有向图的初始容量
		int max=EdmondsKarp(0, 4, cap);
		System.out.println(max);
		
	}
	public static int EdmondsKarp(int start,int end,int[][] cap){
		int [][] flow =new int [cap.length][cap[0].length];	//记录流量
		int [] pre = new int[cap.length];	//记录前一个节点
		int [] rest = new int[cap.length];	//记录剩余的流量,残量
		
		int maxflow = 0;
		
		for(int i=0;i<flow.length;i++){
			Arrays.fill(flow[i], 0);		
		}
		
		Arrays.fill(pre, 0);	
		
		LinkedList list = new LinkedList<Integer>();
		
		while(true){
//			System.out.println("yici");
			for(int j =0 ;j<rest.length;j++){//设置残量都为0
				rest[j] =0;
			}
			rest[start] = 10000000;	//设置起始位置的残量为一个很大的值
			list.add(start);
			while(!list.isEmpty()){			//BFS 寻找增广路
//				System.out.println("yici");
				int u = (int)list.pollFirst();
				for(int v =0;v<=end;v++){
					if(rest[v]==0 && cap[u][v]-flow[u][v] > 0){
						pre[v] =u;		//设置前面的节点
						rest[v] = Math.min(rest[u], cap[u][v]-flow[u][v]);//获取start到v节点的最小残量
						list.add(v);
					}
				}
			}
//			System.out.println(rest[end]+"rest[end]");
			
			maxflow += rest[end];
			
			if(rest[end] == 0){
				return maxflow;
			}
			
			for(int u=end;u!=start;u=pre[u]){	//从汇点往回走
				flow[pre[u]][u] += rest[end];	//更新正向流
				flow[u][pre[u]] -= rest[end];	//更新反向流
				System.out.print(u+" ");
			}
			
			System.out.print(start+"  ");
			
			System.out.println("寻找至本次的流为: "+maxflow);
		}
		
		
		
//		return maxflow;
	}
	
	//
	
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值