网络流二十四题 ————(八)、P4016 负载平衡问题 最小费用最大流 spfa+dij两种版本写法对比

本文通过一个负载平衡问题展示了如何利用最小费用最大流算法进行求解。首先计算平均数tp,然后建立网络流模型,连接需要货物输送的仓库。比较了SPFA和Dijkstra两种算法在解决此类问题时的效率和适用场景,指出在稀疏图中SPFA表现优秀,而稠密图可能需要考虑Dijkstra算法。
摘要由CSDN通过智能技术生成

 

建模比较简单:

求出平均数tp。

让S连向 a[i]>tp的节点表示这些仓库需要货物送出,让a[i]<tp的节点连向T表示这些仓库需要货物送入。容量为差值,花费为0

然后相邻点连边,容量为inf,花费为1,表示相邻两点可以传送货物。

//这里可以不连满,只从a[i]>tp 的点连向a[i]<tp的点也行!

以下是最小费用最大流的两种写法对比:

当图是稀疏图时,spfa有很高的效率,而稠密图spfa很容易被卡掉。视情况选择就行。

dij版本

#include<bits/stdc++.h> 
using namespace std;
const int N = 5001;
const int M = 50001;
struct MCMF
{	
	int n,  s, t, cnt = 1;
	long long maxflow=0, mincost=0;
	int dis[N], head[N], incf[N], pre[N];//dis表示最短路,incf表示当前增广路上最小流量,pre表示前驱
	bool vs[N];
	int h[N];//dij中的势能 
	struct EDGE {
		int nxt, to,  flow,cost;
	}ee[M << 1];
	inline void AD(int x, int y, int flow, int cost) {
		ee[++cnt].nxt = head[x];
		ee[cnt].to = y;
		ee[cnt].cost = cost;
		ee[cnt].flow = flow;
		head[x] = cnt;
	}
	inline void ad
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值