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

article/2025/9/28 19:49:09

先来介绍一下什么是费用流(部分内容参考bilibili董晓算法)

给定一个网络G=(V,E),每条边有容量限制w(u,v),还有单位流量的费用c(u,v)。

当(u,v)的流量为f(u,v)时,需要花费f(u,v)*c(u,v)的费用。

该网络中总花费最小的最大流称为最小费用最大流,总花费最大的最大流称为最大费用最大流,二者合称费用流模型,即在最大流的前提下考虑费用的最值。

一个网络的最大流是唯一的,不同路径有不同的费用。

我们用w f/c表示边的边权 流量/容量。

我们下边就主要写一些最小费用最大流的求解方法,也就是在最大流的前提下求解费用的最小值。这个过程是基于EK算法进行改进的,不懂EK算法的小伙伴可以看下这里:https://blog.csdn.net/AC__dream/article/details/126457160

我们求解最大流时是在EK算法中利用bfs找增广路,而我们现在把找增广路改成利用spfa寻找一条单位费用之和最小的增广路就可以用于在最大流的前提下求解最小费用,也就是把c(u,v)当作边权,在残留网上求最短路,这样就能够求出最小费用最大流。

为了退流,反向边的初始容量为0,反向边的容量每次+f

为了退费,反向边的初始费用为-w,走反向边的花费+f*(-c)

因为需要退费,也就是说反向边的费用是负值,那么也就是说在求解最短路的过程中存在负边权,所以要用SPFA算法。

需要注意的一点是如果图上存在单位费用的负环,那么无法直接求出该网络的最小费用最大流。此时需要先使用消圈算法消去图上的负圈。

下面附上一道模板题

题目链接:【模板】最小费用最大流 - 洛谷

样例输入:

4 5 4 3
4 2 30 2
4 3 20 3
2 3 20 1
2 1 30 9
1 3 40 5

样例输出:

50 280

细节见代码:

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<map>
#include<queue>
#include<vector>
#include<cmath>
using namespace std;
const int N=5e3+10,M=1e6+10;
int h[N],ne[M],e[M],idx,pre[N];
long long w[M],c[M],d[N],mf[N];
bool vis[N];
int n,m,s,t;
void add(int x,int y,long long z1,long long z2)
{e[idx]=y;w[idx]=z1;c[idx]=z2;ne[idx]=h[x];h[x]=idx++;
}
bool spfa()
{memset(d,0x3f,sizeof d);//d[]用于求解最短路 memset(mf,0,sizeof mf);//由于函数返回值是与mf有关的,所以务必要初始化mf数组d[s]=0;mf[s]=0x3f3f3f3f3f3f3f3f; queue<int>q;q.push(s);vis[s]=true;while(!q.empty()){int x=q.front();q.pop();vis[x]=false;for(int i=h[x];i!=-1;i=ne[i]){int j=e[i];if(d[j]>d[x]+c[i]&&w[i]){mf[j]=min(mf[x],w[i]);d[j]=d[x]+c[i];pre[j]=i;if(!vis[j]){q.push(j);vis[j]=true;}}}}return mf[t]>0;
}
void EK(long long &flow,long long &cost)
{while(spfa()){int x=t;while(x!=s)//修改残留网 {int id=pre[x];w[id]-=mf[t];w[id^1]+=mf[t];x=e[id^1];}flow+=mf[t];//累加流量 cost+=mf[t]*d[t];//累加费用 }
}
int main()
{cin>>n>>m>>s>>t;for(int i=1;i<=n;i++) h[i]=-1;for(int i=1;i<=m;i++){int u,v;long long x,y;scanf("%d%d%lld%lld",&u,&v,&x,&y);add(u,v,x,y);add(v,u,0,-y);}long long flow=0,cost=0;EK(flow,cost);printf("%lld %lld",flow,cost);return 0;
}

http://chatgpt.dhexx.cn/article/AR4XRoLr.shtml

相关文章

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

【图论】网络流——最大流和最小费用流 文章目录 【图论】网络流——最大流和最小费用流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;至于协议则是定义了每…

广播域和冲突域

在准备软考的时候将广播域看成了广域网,结果就错了一道题,这篇文章就从这道错题开始... 1.广播域和冲突域的定义 广播域:网络中能接受任一设备发出的广播帧的设备的集合. 冲突域:在同一个网络内,如果任意两台计算机在同时通信是会发生冲突,那么它们所组成的网络就是一个冲突域…

计算机网络 —— 冲突域和广播域

一、概念 &#xff08;1&#xff09;冲突域 定义&#xff1a;同一时间内只能有一台设备发送信息的范围。 分层&#xff1a;基于OSI的第一层物理层 设备&#xff1a;第二层设备能隔离冲突域&#xff0c;比如Switch。交换机能缩小冲突域的范围&#xff0c;交换接的每一个端口就…

冲突域与广播域

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

向上取整的代码写法

如何实现向上取整 例如&#xff0c;x / n 上取整&#xff0c;代码如下 v (x (n - 1)) / n 下取整呢&#xff1f;haha v x / n 例题 森林中&#xff0c;每个兔子都有颜色。其中一些兔子&#xff08;可能是全部&#xff09;告诉你还有多少其他的兔子和自己有相同的颜色。我们…