一句话网络流(EK,Dinic,最小费最大流,(最大/最小)可行流,最小费用可行流)

本文介绍了网络流算法中的EK算法和Dinic算法,用于求解最大流问题。同时,详细阐述了如何解决最小费用流问题,包括有上下限的网络流情况,如无汇源可行流、有汇源可行流、有汇源最大可行流和有汇源最小可行流。最后提到了最小费用可行流的应用实例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

EK算法求最大流:
BFS找增广路增广直到无法增广
复杂度:O(V*E^2)
核心代码(邻接表存图):(一开始学最大流的时候写的代码,非常丑)

int pre[maxn];
int vis[maxn]={0};
bool bfs(){//bfs求路径
	for(int i = 0;i <= n+1;++i) vis[i] = 0;
	queue<int> q;q.push(0);vis[0] = 1;
	while(q.size()){
		int u = q.front();q.pop();
		for(int i = head[u];i!=-1;i = e[i].nxt){
			int v = e[i].v;
			if(vis[v]) continue;
			if(e[i].f == 0) continue;
			vis[v] = 1;
			pre[v] = i;
			q.push(v);
		}
	}
	return vis[n+1];
}

while(bfs()){//更新正向边和反向边的流量
		ll d = inf;
		int u,v;
		v = n+1;
		while(v!=0){
			u = e[pre[v]].u;
			d = min(d,e[pre[v]].f);
			v = u;
		}
		v = n+1;
		while(v != 0){
			u = e[pre[v]].u;
			if(pre[v]&1) mp[u][v]-=d;
			else mp[u][v]+=d;
			e[pre[v]].f -= d;
			e[pre[v]^1].f += d;//给反向边加上回流 
			v = u;
		}
		ans += d;
	}

Dinic算法求最大流:
先用BFS求图的层次,然后DFS根据BFS求得的深度增广(只走深度比当前结点大1的点)
复杂度:O(V^2 * E)
核心代码:

int dep[maxn];
int q[maxn*2];
int tot,tail;
bool bfs(){
	memset(dep,-1,(ex+1)<<2);
	dep[st] = 1;
	q[tot = 0] = st,tail = 1;
	while(tot < tail){
		int u = q[tot++];
		if(u == ed) break;
		for(int i = head[u];~i;i = e[i].nxt){
			int v = e[i].v;
			if(dep[v]!=-1 || !e[i].f) continue;
			dep[v] = 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值