`
yzmduncan
  • 浏览: 330347 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
文章分类
社区版块
存档分类
最新评论

网络流之——最大流

阅读更多

    最大流算法是网络流中基础的算法,解决的方法有很多,比如EK,Dinic,sap等等,在这里介绍一下EK算法。

    从源点s开始广度优先寻找一条到t的路径,计算出这条路径的最大流量(短板效应)l,回溯,将这条路径的每条边的最大流量减去l,然后添加反向边,容量为l,网络流的最大流max+=l。当找不到从s到t的一条路径时退出,最大流量即为max。

    EK模板:

#include <iostream>
#include <queue>
using namespace std;
const int N = 202;
const int INF = 0x7fffffff;
queue<int> q;
int n,m;		//m为标号(从1到m),n为边数
int start,end;

int map[N][N];
int path[N];		//结点的前驱结点
int flow[N];		//标记从源点到当前节点实际还剩多少流量可用

int bfs()
{
	int i,t;
	while(!q.empty()) q.pop();
	memset(path,-1,sizeof(path));
	path[start] = 0, flow[start] = INF;			//初始化工作
	q.push(start);
	while(!q.empty())
	{
		t = q.front();
		q.pop();
		if(t == end) break;						//队列非空&&结点end未被访问
		for(i = 1; i <= m; i++)					//对t发出的每一条边(t,i),如果i未访问
		{
			if(i!=start && path[i]==-1 && map[t][i])
			{
				flow[i] = flow[t] < map[t][i] ? flow[t] : map[t][i];	//弧(t,i)可改进
				q.push(i);
				path[i] = t;
			}
		}
	}
	if(path[end] == -1)
		return -1;
	return flow[end];			//一次遍历之后的流量增量(剩余多少流量)
}

int Edmonds_Karp()
{
	int max_flow = 0;
	int step,now,pre;
	while((step=bfs())!=-1)				//找不到路径时退出
	{
		max_flow += step;
		now = end;
		while(now != start)
		{
			pre = path[now];
			map[pre][now] -= step;		//更新正向边的实际容量(涉及反向边和残余图,证明复杂,不去深究)
			map[now][pre] += step;		//添加反向边
			now = pre;
		}
	}
	return max_flow;
}

int main()
{
	int i,a,b,cost;
	while(scanf("%d %d",&n,&m) != EOF)
	{
		memset(map,0,sizeof(map));
		for(i = 0; i < n; i++)
		{
			scanf("%d %d %d",&a,&b,&cost);
			map[a][b] += cost;				//输入可能出现相同的边
		}
		start = 1, end = m;
		printf("%d\n",Edmonds_Karp());
	}
	return 0;
}

 其实,当已知一个网络,求最大流就非常简单,直接套用模板就行,但往往难点在建图,如何将题目描述转化为一个单源单汇的网络,下面列举几个题目:

POJ1459

题目大意:有n个发电站,m个变压器,c个消费者,发电站不消耗电能,消费者不产生电能,变压器既不产生电能也不消耗电能。每个发电站都有最大的发电量,消费者也有最大的消耗量,每两个点之间的线路也有最大容量。现在要求出这个网络的最大流量(显然,在整个网络中,产生电量=消耗电量)。

分析:显然这是一个多源多汇的网络模型,可以做如下转化:增加一个超级源点s,它跟每个发电站连一条线,容量为发电站的最大发电量,增加一个超级汇点t,每个消费者跟它连一条线,容量为消费者的最大消费量。这样,问题就转化为求这样单源单汇的简单网络流。

POJ1149

题目大意:一个养猪场有n个猪房,每个猪房可以装无限多的猪,每个顾客都有特定的猪房钥匙和购买量,每个顾客买完后重新锁上打开的猪房,但锁上之前可以将某猪房的猪分一些给另外一些猪房(即打开的猪房之间可以相互调整数量),问最多能卖出多少头猪。

分析:可以把顾客作为结点,增加源点s和汇点t,如果该客户是第一个拥有猪房钥匙的人,从源点连接一条边到该客户;如果不是第一人,那么从前一个拥有该猪房钥匙的客户连一条边到该客户,容量为无穷;从每个客户连一条边到t,容量为该客户购买量。这样,就转化为简单的网络流。

 

 

 

 

分享到:
评论

相关推荐

    网络流讲解之三——最大费用和最大流问题

    网络流讲解之三——最大费用和最大流问题 希望对你的理解有所帮助

    wll.rar_最大网络流

    《最大网络流算法详解——基于ISAP的邻接表实现》 在计算机科学领域,网络流问题是一个重要的图论问题,广泛应用于各种实际场景,如运输规划、电路设计、资源分配等。本压缩包文件“wll.rar”提供的是一种解决最大...

    网络流24题——ACM算法网络流

    另外,还有一种结合了网络流和最小割的Karush-Kuhn-Tucker(KKT)条件的算法,可以求解最小费用最大流。 四、多源多汇网络流 在某些问题中,可能存在多个源点和多个汇点。这种情况下,可以将多源多汇问题转化为单源...

    图与网络——最大流问题

    网络流是指在满足以下条件下的流量分配: 1. 容量约束:每条边e的流量f(e)不能超过其容量c(e)。 2. 流量守恒:在每个中间点v,进入的流量等于离开的流量,即Σ(f(e)) for e in Nv+ = Σ(f(e)) for e in Nv-。 流量...

    最大流最小截问题——网络优化

    最大流问题:特殊的线性规划问题;是计算机科学和运筹学的研究内容;最大流实际上是在有容量限制的网络中求一个可行流,使其流量达到最大

    一种最大流算法——SAP

    ### 最大流算法——SAP算法详解 #### 1. 引言 在网络流理论中,最大流问题是一项核心研究内容。它旨在寻找一个网络中从源点到汇点的最大流量值,这个问题不仅在计算机科学领域有着广泛的应用,如网络传输、任务调度...

    现代通信译丛 网论——网络流

    6. **增广路径**:在寻找最大流的过程中,增广路径是指一条从源节点到汇节点且沿途所有边的剩余容量之和大于零的路径。通过增广路径可以逐步增加当前流的值,直到达到最大流。 7. **网络流的应用**:网络流模型广泛...

    网络最大流算法的改进

    网络最大流算法的改进——断路法,不仅提升了算法的执行效率,还简化了最大流问题的求解过程。通过对路径的优化选择和流量的精确控制,断路法展现了其在现代网络分析与优化领域的巨大潜力。未来,随着计算机技术的...

    最大流(一)——各种思路

    最大流问题是一个经典的图论问题,在网络流理论中占有重要地位。它主要研究在一个有向图中,如何从源点到汇点分配流量,使得总流量达到最大。这个问题在实际生活中有着广泛的应用,如电路设计、水资源分配、运输调度...

    基于网络数据挖掘的旅游流网络结构特征研究——以浙江省为例.pdf

    网络密度指的是网络中实际连接数与可能最大连接数的比例,它反映了网络节点之间的连通性。中心势则表示网络中节点间连接分布的集中程度。如果中心势较高,说明网络中有少数节点处于网络中心,对网络中信息的流动有较...

    网络流经典第二十四题(题目+数据+标程)

    总的来说,解决网络流经典第二十四题——骑士共存问题,需要掌握网络流的基本理论,理解最大流算法,以及如何将实际问题转化为线性规划模型。通过实践和分析提供的数据,可以进一步提高对这些问题解决能力的掌握。

    网络流及其应用

    “最小费用最大流.ppt”则涉及到了网络流的一个扩展问题——最小费用最大流。在某些情况下,我们不仅关心流量的最大化,还希望在达到最大流量的同时,使得总的费用(如运输成本)最小。这类问题可以结合最大流问题与...

    最大流和最小截.zip

    解决最小截问题可以采用最大流的对偶问题——最大双匹配或者割平面法。 在MATLAB中,我们可以通过求解最大流后,找出网络中所有满流的边,这些边构成了一个最小截。同时,我们还可以利用MATLAB的优化工具箱来辅助...

    Matlab程序源代码网络流.zip

    这里我们关注的是“Matlab程序源代码网络流”,这涉及到图论中的一个重要概念——网络流问题。 网络流是图论的一个分支,研究在网络(由节点和边构成)中如何有效地从一个源头节点向一个汇点节点传输资源或流量,...

    网络流基础

    **定理1**:**最大流最小割定理**,这是网络流理论的核心之一,它表明在一个网络中,从源点到汇点的最大流量等于任意最小割集的容量总和。最小割是指能够将源点和汇点分开的边集合,且这些边的容量总和最小。 #### ...

    网络运维笔记——T221.pdf

    【网络运维笔记——TCP与UDP报文首部详解】 TCP(Transmission Control Protocol)和UDP(User Datagram Protocol)是网络通信中的两种主要传输层协议。TCP 是一种面向连接、可靠的协议,而 UDP 则是无连接、不可靠...

    网络练习和答案——————

    这篇资料主要涵盖了计算机网络的基础知识,包括网络设备、数据编码、网络层次结构、协议、网络连接方式等多个方面。以下是根据提供的内容提炼出的知识点: 1. 调制解调器(MODEM)的功能:调制解调器主要用于模拟...

    巨量网络题目——中科院

    在局域网中,最大距离为2公里时,通过计算传播延迟与分组发送延迟的平衡点,可以得出所需带宽。 - 对于不同大小的分组(如100字节和512字节),所需的带宽也会不同。 3. **通信协议开销分析**: - 每个分组有固定...

Global site tag (gtag.js) - Google Analytics