网络流(一)最大流问题EdmondsKarp和最小费用最大流

article/2025/9/28 19:24:42

一、最大流问题

如下图所示,假设需要把一些物品从结点S(称为源点)运送到结点t(称为汇点),可以从其它结点中转。每条边上的权值(左图)表示该条路径最多能运送的物品数,右图边上的权值第一个数表示实际运送的物品数目(flow),第二个数表示最多能运送物品的数目(即容量capacity),也称为题目中的上限。


最大流问题的三个性质:

(1)容量限制:f(u,v)<c(u,v),即每条边的流量小于容量,对于不存在的边c(u,v)=0;

(2)流量平衡:对于除了s和t结点外的任意结点u,\sum f(u,v)=0;

(3)斜对称性:f(u,v)=-f(v,u),把3个物品从u运送到v等同于把3个物品从v运送到u,这样规定f(u,v)和f(v,u)最多只有一个正数(可以均为0).

问题目标:

从s点流出的净流量(等于t流入的净流量)最大。

二、最大增广路算法

求解最大流问题的算法,从零流(所有边的流量均为0)开始不断增加流量,保持每次增加流量后都满足容量限制,斜对称性和流量平衡三个条件。

如上图所示,根据图(a)中的各边值计算出每条边的容量与流量之差——残余容量,即残量。

例如

s到v2这条边:s->v2=13-8=5; v2->s=0-(-8)=8;

v2到v3这条边:v2->v3=0-(-4)=4; v3->v2=9-4=5;

注意残量网络中的边数可达到原图中边数的两倍。

算法思想:从s到t的任何一条道路都对应原图中的一条增广路(augmenting path),只要求出该道路中所有残量的最小值d,把对应的所有边上的流量加上d即可,直到d为0不可增加为止停止迭代。

代码如下:

struct Edge
{int from,to,cap,flow;Edge(int a,int b,int c,int d):from(a),to(b),cap(c),flow(d){}
};
struct EdmondsKarp
{int n,m;vector<int> G[maxn];vector<Edge> edges;int a[maxn];int p[maxn];void init(){int i;for(i=0;i<n;i++){G[i].clear();}edges.clear();}void addEdge(int u,int v,int c){edges.push_back(Edge(u,v,c,0));edges.push_back(Edge(v,u,0,0));m=edges.size();G[u].push_back(m-2);G[v].push_back(m-1);}int maxFlow(int s, int t){int flow=0,i,u;for(;;){memset(a,0,sizeof(a));queue<int> q;q.push(s);while(!q.empty()){int x=q.front();q.pop();for(i=0;i<G[x].size();i++){Edge& e=edges[G[x][i]];if(!a[e.to]&&e.cap>e.flow){p[e.to]=G[x][i];a[e.to]=min(a[x],e.cap-e.flow);q.push(e.to);}}if(a[t]) break;}if(!a[t]) break;for(u=t;u!=s;u=edges[p[u]].from){edges[p[u]].flow+=a[t];edges[p[u]^1].flow-=a[t];}flow+=a[t];}return flow;}
};

采用BFS找增广路,a[]的值为0表示未被访问。

三。最小费用最大流问题

给网络流增加一个因素——费用cost,单位流量所需的cost。如图所示,c和a分别表示容量和费用。有图给出了一个在总流量最大的前提下,总费用最小的流。

在最小费用流中,平行边变得有意义了,可能会有两条边从u到v。由于费用的出现,无法合并这两条弧。先假定图中不存在平行边或反向边,用两个邻接矩阵cap和cost保存各边的容量和费用。为了允许反向增广,规定cap[v][u]=0并且cost[v][u]=-cost[u[[v]。

代码:

struct Edge
{int from,to,cap,flow,cost;Edge(int u,int v,int c,int f,int w):from(u),to(v),cap(c),flow(f),cost(w){}
};
struct MCMF
{int n,m;vector<int> G[maxn];vector<Edge> edges;int inq[maxn];int d[maxn];int p[maxn];int a[maxn];void init(int n){this->n=n;for(int i=0;i<n;i++){G[i].clear();}edges.clear();}void addEdge(int from,int to,int cap,int cost){edges.push_back(Edge(from,to,cap,0,cost));edges.push_back(Edge(to,from,cap,0,-cost));m=edges.size();G[from].push_back(m-2);G[to].push_back(m-1);}bool bellmanFord(int s,int t,int& flow,long long &cost){for(int i=0;i<n;i++) d[i]=INF;memset(inq,0,sizeof(inq));d[s]=0;inq[s]=1;p[s]=0;a[s]=INF;queue<int> q;q.push(s);while(!q.empty()){int u=q.front();q.pop();inq[u]=0;for(int i=0;i<G[u].size();i++){Edge& e=edges[G[u][i]];if(e.cap>e.flow&&d[e.to]>d[u]+e.cost){d[e.to]=d[u]+e.cost;p[e.to]=G[u][i];a[e.to]=min(a[u],e.cap-e.flow);if(!inq[e.to]){q.push(e.to);inq[e.to]=1;}}}}if(d[t]==INF) return false;flow+=a[t];cost+=(long long)d[t]*(long long)a[t];for(int u=t;u!=s;u=edges[p[u]].from){edges[p[u]].flow+=a[t];edges[p[u]^1].flow-=a[t];}}int MincostMaxflow(int s,int t,long long &cost){int flow=0;cost=0;while(bellmanFord(s,t,flow,cost));return flow;}
};

没有再采用BFS,而是BellmanFord算法寻找增广路。只要初始流是该流量下的最小费用可行流,每次增广后的新流都是新流量下的最小费用流。


http://chatgpt.dhexx.cn/article/2l1gOg3J.shtml

相关文章

最大流,最小费用最大流:解析 + 各种板子

网络流初步 Edmond-Karp算法 网络流的基本概念 源点&#xff0c;这个点只有流量的流出&#xff0c;没有流入。汇点&#xff0c;这个点只有流量的流入&#xff0c;没有流出。容量&#xff0c;每条有向边的最大可承受的流的理论大小。流量&#xff0c;每条有向边的最大可承受的…

分配问题(最小费用最大流)

题目&#xff1a;有 n 件工作要分配给 n 个人做。第 i个人做第 j件工作产生的效益为 。试设计一个将 n件工作分配给 n个人做的分配方案&#xff0c;使产生的总效益最大。 分析&#xff1a;这是一道多解法问题&#xff0c;可以用带剪枝的搜索和图论的最小费用最大流的方法来做&…

最小费用最大流算法 网络流

最小费用最大流算法 图片来源 《趣学算法》 人民邮电出版社 陈小玉 代码实现 /* 参考:《趣学算法》陈小玉 人民邮电出版社 最小费用最大流---最小费用路算法 问题分析:在实际应用中&#xff0c;要同时考虑流量和费用&#xff0c;每条边除了给定容量之外&#xff0c;还定义了一…

网络流----最小费用最大流(EK+SPFA)

先来介绍一下什么是费用流&#xff08;部分内容参考bilibili董晓算法&#xff09; 给定一个网络G&#xff08;V&#xff0c;E&#xff09;&#xff0c;每条边有容量限制w(u,v)&#xff0c;还有单位流量的费用c(u,v)。 当&#xff08;u,v&#xff09;的流量为f(u,v)时&#xf…

【图论】网络流——最大流和最小费用流

【图论】网络流——最大流和最小费用流 文章目录 【图论】网络流——最大流和最小费用流1. 最大流问题1.1 基本概念1.2 寻求最大流的算法&#xff08;Ford-Fulerson&#xff09;1.3 matlab求最大流 2. 最小流问题2.1 基本概念2.2 求最小流的迭代算法2.3 matlab 求最大费用最小流…

网络流(2)-----最小费用最大流(附带讲解SPFA算法)

一.最小费用最大流&#xff08;简称费用流&#xff09;概念 1.什么是费用流问题 上篇文章我们讲解了最大流问题&#xff0c;那什么是最小费用最大流呢&#xff1f;听名字就可以看出&#xff0c;我们要在满足最大流的同时找到达成最大流的最小费用。对于一个网络流&#xff0c…

最小费用最大流问题详解

最小费用最大流问题 一、问题描述 在网络中求一个最大流f&#xff0c;使流的总输送费用最小。 b ( f ) ∑ ( v i , v j ) b i j f i j b(f) \sum\limits_{(v_i,v_j)} b_{ij} f_{ij} b(f)(vi​,vj​)∑​bij​fij​ ) &#xff08; b i j b_{ij} bij​ 表示弧 ( v i , v j…

最小费用最大流问题与算法实现(Bellman-Ford、SPFA、Dijkstra)

摘要 今日&#xff0c;对最小费用最大流问题进行了一个简单的研究&#xff0c;并针对网上的一些已有算法进行了查找和研究。博客和资料很多&#xff0c;但是留下的算法很多运行失败、出错&#xff0c;或者意义不明。这里&#xff0c;个人对其中的Bellman-Ford、SPFA、改进的Di…

如何区分冲突域和广播域?

举个例子&#xff0c;原始社会的人都生活在山洞里&#xff0c;每个人都住在自己的山洞里&#xff0c;洞穴的中间只有一个狭长的走廊可以出去&#xff0c;平时出去玩&#xff0c;大哥都会喊一嗓子&#xff0c;有人出去打猎不&#xff0c;所有人都听得到&#xff0c;这就是一个广…

冲突域和广播域区别

一、区别 1、广播域就是说如果站点发出一个广播信号后能接收到这个信号的范围。通常来说一个局域网就是一个广播域。冲突域指一个站点向另一个站点发出信号。除目的站点外&#xff0c;有多少站点能收到这个信号。这些站点就构成一个冲突域。 2、冲突域通过集线器连接&#xf…

冲突域和广播域区别,集线器、交换机和路由器对比

冲突域 我们把以太网想象为对讲机&#xff0c;电脑想象为使用对讲机的人&#xff0c;数据传输想象为使用对讲机说话。现在一群人打真人CS&#xff0c;两个及以上的人同时通过对讲机说话&#xff0c;就听不清在说什么了&#xff0c;这就是冲突。对讲机通道只能一人单独使用。对…

冲突域和广播域; 集线器、交换机以及路由器比较

转自https://blog.csdn.net/gui951753/article/details/79402528#1%E5%B7%A5%E4%BD%9C%E5%B1%82%E6%AC%A1%E4%B8%8D%E5%90%8C 目录 冲突域和广播域 联网中继设备 集线器&#xff08;hub&#xff09; 交换机(switch) 路由器(route) 三者的异同 冲突域和广播域 在介绍这三…

交换机基础原理,冲突域和广播域

交换机的基本定义 提供了大量的接入端口&#xff0c;能够很好的满足大量用户接入到网络中的需求。 在OSI模型的二层&#xff0c;数据链路层&#xff1b; 可以识别数据包中的MAC地址信息&#xff0c;根据MAC地址进行转发数据&#xff0c;并且会将这些MAC地址与对应的端口记录在…

冲突域和广播域的区分

一、概念理解&#xff1a; 1、冲突域&#xff08;物理分段&#xff09;&#xff1a; 连接在同一导线上的所有工作站的集合&#xff0c;或者说是同一物理网段上所有节点的集合或以太网上竞争同一带宽的节点集合。这个域代表了冲突在其中发生并传播的区域&#xff0c;这个区域可…

冲突域和广播域的区别

冲突域 冲突域指的是会产生冲突的最小范围&#xff0c;在计算机和计算机通过设备互联时&#xff0c;会建立一条通道&#xff0c;如果这条通道只允许瞬间一个数据报文通过&#xff0c;那么在同时如果有两个或更多的数据报文想从这里通过时就会出现冲突了。 冲突域的大小可以衡…

冲突域和广播域

冲突域&#xff1a; 冲突域是信道的争抢&#xff0c;信道只有一条&#xff0c;A在使用&#xff0c;B就不可以使用&#xff0c;这样就会产生冲突&#xff0c;这就是冲突域的产生 在一个信道上的所有主机组成一个冲突域&#xff0c;划分网络越小越好&#xff0c;不会引起很大的冲…

如何理解冲突域和广播域?(转)

如何理解冲突域和广播域&#xff1f;&#xff08;转&#xff09; 转自&#xff1a;http://blog.sina.com.cn/s/blog_7e8dec240102wyio.html 网上看到的好文章&#xff0c;整理下来&#xff0c;方便复习&#xff0c;侵删 1、冲突域&#xff1a; 【定义】在同一个冲突域中的每…

设备划分冲突域和广播域

冲突域是一种物理分段&#xff0c;指连接到同一导线上所有工作站的集合、同一物理网段上所有节点的集合或是以太网上竞争同一带宽节点的集合。冲突域表示冲突发生并传播的区域&#xff0c;这个区域可以被认为是共享段。在OSI模型中&#xff0c;冲突域被看作是OSI第一层的概念&a…

HCIA—冲突域与广播域(详解 + 区别)

目录 一、冲突域&#xff1a; &#xff08;1&#xff09;HUB组网&#xff1a; &#xff08;2&#xff09;冲突域 概述 特点&#xff1a; 二、广播域&#xff1a; &#xff08;1&#xff09;广播域 概述特点&#xff1a; 三、冲突域 与 广播域的区别与联系&#xff1a; 一…

网络基础之冲突域和广播域

温故&#xff1a; 前面的几天 &#xff0c;主要讲了OSI网络七层的相关知识&#xff0c;着重的分析了每一层所具备的功能和服务&#xff0c;在这里我再次强调一遍&#xff1a;功能指的是本层的作用&#xff0c;服务指的是本层能为上层提供的业务&#xff0c;至于协议则是定义了每…