网络流---最大流(Edmond-Karp算法)的学习

原创 2018年04月17日 19:49:13

先上个代码,等有空补充详解

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<queue>
#include<algorithm>
using namespace std;
const int maxn = 1010;
const int INF = 0x3f3f3f3f;
int Map[maxn][maxn];
int maxflow,n,m;
int pre[maxn],flow[maxn];
int start,end;

void init(){
	maxflow=0;
	memset(Map,0,sizeof(Map));
	memset(flow,0,sizeof(flow));
	memset(pre,-1,sizeof(pre));
}

void input(){
	int u,v,w;
	start=1;
	end=n; 
	while(m--){
		cin>>u>>v>>w;
		if(u==v)continue;//起点和终点不可相等 
		Map[u][v]+=w;//存在u和v之间有多条边 
	}
}

int bfs(){
	queue<int>q;
	q.push(1);
	pre[1]=0;
	flow[1]=INF;
	while(!q.empty()){
		int u=q.front();
		q.pop();
		if(u==end)break;
		for(int i=1;i<=n;i++){
			if(i!=start&&pre[i]==-1&&Map[u][i]>0){
				flow[i]=min(flow[u],Map[u][i]);
				pre[i]=u;
				q.push(i);
			}
		}
	}
	if(pre[end]==-1)return -1;//如果找不到增广路,返回-1 
	else return flow[end];
} 

void ek(){
	int ff=0;
	while(1){
		ff=bfs();//bfs寻找增广路 
		if(ff==-1)break;//如果找不到增广路,退出循环 
		maxflow+=ff;//加到最大流中 
		int k=n;
		while(k!=1){//利用前驱寻找路径 
			Map[pre[k]][k]-=ff;
			Map[k][pre[k]]+=ff;
			k=pre[k];
		}
		memset(pre,-1,sizeof(pre));//再次初始化 
		memset(flow,0,sizeof(flow)); 
	}
	cout<<maxflow<<endl;
}

int main(){
	ios::sync_with_stdio(false);
	cin>>n>>m;//n个顶点,m条边 
	init();//初始化 
	input();//输入 
	ek();//ek算法流程 
	return 0;
}
/*
4 5
1 2 5
1 3 5
2 3 5
2 4 5
3 4 5
*/



版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/m0_37444209/article/details/79979708

最大流算法---Edmond-Karp

这个算法是基于FF方法,就是通过不断求残余网络的增广路来增广流量,直到找不到增广路为止。注意:每次找到增广路以后都要更新原网络。EK算法通过BFS寻找源S到汇T的一条最短路径,因此时间复杂度是O(VE...
  • u013171170
  • u013171170
  • 2014-04-30 18:37:01
  • 728

网络流 最大流 Edmonds-Karp算法

Edmonds-Karp算法,复杂度O(VE^2)。思想就是找增广路,不断增加流量。在残量(每条边上流量和容量的差)图上找一条每个边权值都为正的路(可以通过BFS,比DFS效率高),这些边权值里的最小...
  • corncsd
  • corncsd
  • 2014-01-21 17:20:57
  • 775

网络流最大流之SAP算法 详解

网络流最大流之SAP算法 首先引入几个新名词: 1、距离标号: 所谓距离标号 ,就是某个点到汇点的最少的弧的数量(即边权值为1时某个点到汇点的最短路径长度)。 设点i的标号为level[i],...
  • disgustinglemon
  • disgustinglemon
  • 2016-05-02 15:41:55
  • 3236

网络流之最大流算法(EdmondsKarp)

求网络流有很多算法,这几天学习了两种,记录一下EK算法。 首先是网络流中的一些定义: V表示整个图中的所有结点的集合. E表示整个图中所有边的集合. G = (V,E) ,表示整个图. s表...
  • y990041769
  • y990041769
  • 2014-03-11 18:05:32
  • 77915

网络流 最大流—最小割 之SAP算法 详解

首先引入几个新名词: 1、距离标号: 所谓距离标号 ,就是某个点到汇点的最少的弧的数量(即边权值为1时某个点到汇点的最短路径长度)。 设点i的标号为level[i],那么如果将满足level[i...
  • txl16211
  • txl16211
  • 2017-03-24 16:40:21
  • 1606

最大流(网络流基础概念+三个算法)

下面是由一道题引发的一系列故事。。。 题目链接 http://poj.org/problem?id=1273 Drainage Ditches Time Limit: 1000MS M...
  • x_y_q_
  • x_y_q_
  • 2016-07-22 21:12:31
  • 11247

网络流sap算法(whitecloud)

  • 2012年08月31日 16:09
  • 137KB
  • 下载

网络流之最大流(FF, EK, Dinic, SAP)

对于Gap优化成立的解释: 假如某次修改d[u]后第一次出现断层k,显然d[u]之前是等于k的,而d[u]修改的原因是修改前d[u] < d[v]+1,所以d[v] > k-1,而因为出现断层k,d[...
  • yo_bc
  • yo_bc
  • 2017-05-31 23:50:31
  • 856

[网络流]最大流算法 Dinic

最近做了几道题,发现用Ek算法会超时,而事实上,Ek算法使用的机会并不多,更多的是用Dinic和ISAP算法。所以特地找了一段时间来学习、理解和编Dinic算法。 类似之前的储存方法,但稍作修改,代码...
  • baidu_35009437
  • baidu_35009437
  • 2016-07-29 21:30:39
  • 2389

网络流问题:最大流及其算法

一、概念引入 首先要先清楚最大流的含义,就是说从源点到经过的所有路径的最终到达汇点的所有流量和。       流网络G=(V,E)是一个有向图,其中每条边(u,v)∈E均有一个非负容量c(u,v...
  • vonmax007
  • vonmax007
  • 2017-03-22 16:25:34
  • 9251
收藏助手
不良信息举报
您举报文章:网络流---最大流(Edmond-Karp算法)的学习
举报原因:
原因补充:

(最多只允许输入30个字)