最小费用最大流模板

本文深入探讨了SPFA(Shortest Path Faster Algorithm)算法在最小费用最大流问题中的应用,对比了ZKW模板和SPFA模板的性能,详细解析了SPFA算法的实现过程,并提供了完整的C++代码示例。

用zkw模板跑了一下,简直吓尿。。。我的spfa模板跑需要3s,zkw模板才要0.1s。。。。。。。。。。差距太大了。。

zkw模板还没来得及学,所以将spfa的模板搬上来吧。。

最小费用最大流,就是每次用最短路算法找出增广路,增广即可。

spfa未优化版本:

#include <cstdio>
#include <cstring>
#include <queue>
using namespace std;
#define CC(a, c) memset(a, c, sizeof(a))
#define FOR(i,a,n) for(i=a;i<=n;++i)

const int maxn=1000, maxm=1000000, oo=100000000;
int cap[maxm], cost[maxm], d[maxn], p[maxn];
int ihead[maxn], inext[maxm], to[maxm], from[maxm], cnt;
queue<int> q; int vis[maxn];

int min(const int& a, const int& b) { return a < b ? a : b; }

void add(int u, int v, int c, int w) {
	inext[++cnt]=ihead[u]; ihead[u]=cnt; from[cnt]=u; to[cnt]=v; cap[cnt]=c; cost[cnt]=w;
	inext[++cnt]=ihead[v]; ihead[v]=cnt; from[cnt]=v; to[cnt]=u; cap[cnt]=0; cost[cnt]=0;
}

bool spfa(int s, int t, int n) {
	int i, u;
	FOR(i, 0, n) d[i]=oo; CC(vis, 0); CC(p, 0);
	d[s]=0; q.push(s); vis[s]=1;
	while(!q.empty()) {
		u=q.front(); q.pop();
		for(i=ihead[u]; i; i=inext[i]) if(cap[i]>0 && d[u]+cost[i]<d[to[i]]) {
			d[to[i]]=d[u]+cost[i]; p[to[i]]=i;
			if(!vis[to[i]]) { vis[to[i]]=1; q.push(to[i]); }
		}
		vis[u]=0;
	}
	return d[t]!=oo;
}

void mincost(int s, int t, int n, int& flow, int& mcost) {
	int u, f;
	while(spfa(s, t, n)) {
		for(u=t, f=oo; u!=s; u=from[p[u]]) f=min(f, cap[p[u]]);
		flow+=f; mcost+=f*d[t];
		for(u=t; u!=s; u=from[p[u]]) {
			cap[p[u]]-=f; cap[p[u]^1]+=f; cost[p[u]^1]=-cost[p[u]]; //这里要注意,反向弧的代价要等于正向弧的相反数,这样才能退流
		}
	}
}

void init() {
	cnt=1; CC(ihead, 0);
}

int main() {
	int n, m, u, v, c, w, i;
	scanf("%d%d", &n, &m);
	init();
	for(i=1; i<=m; ++i) {
		scanf("%d%d%d%d", &u, &v, &c, &w);
		add(u, v, c, w);
	}
	int flow, mcost;
	mincost(1, n, n, flow, mcost);
	printf("%d\n", mcost);
	return 0;
}

 

转载于:https://www.cnblogs.com/iwtwiioi/p/3826486.html

源码地址: https://pan.quark.cn/s/d1f41682e390 miyoubiAuto 米游社每日米游币自动化Python脚本(务必使用Python3) 8更新:更换cookie的获取地址 注意:禁止在B站、贴吧、或各大论坛大肆传播! 作者已退游,项目不维护了。 如果有能力的可以pr修复。 小引一波 推荐关注几个非常可爱有趣的女孩! 欢迎B站搜索: @嘉然今天吃什么 @向晚大魔王 @乃琳Queen @贝拉kira 第三方库 食用方法 下载源码 在Global.py中设置米游社Cookie 运行myb.py 本地第一次运行时会自动生产一个文件储存cookie,请勿删除 当前仅支持单个账号! 获取Cookie方法 浏览器无痕模式打开 http://user.mihoyo.com/ ,登录账号 按,打开,找到并点击 按刷新页面,按下图复制 Cookie: How to get mys cookie 当触发时,可尝试按关闭,然后再次刷新页面,最后复制 Cookie。 也可以使用另一种方法: 复制代码 浏览器无痕模式打开 http://user.mihoyo.com/ ,登录账号 按,打开,找到并点击 控制台粘贴代码并运行,获得类似的输出信息 部分即为所需复制的 Cookie,点击确定复制 部署方法--腾讯云函数版(推荐! ) 下载项目源码和压缩包 进入项目文件夹打开命令行执行以下命令 xxxxxxx为通过上面方式或取得米游社cookie 一定要用双引号包裹!! 例如: png 复制返回内容(包括括号) 例如: QQ截图20210505031552.png 登录腾讯云函数官网 选择函数服务-新建-自定义创建 函数名称随意-地区随意-运行环境Python3....
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值