Dinic bzoj1084草地排水

本文介绍了一种基于多路增广与当前弧优化技术的最大流算法实现,通过使用C++代码详细展示了从数据结构定义到核心算法流程的全过程。

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

多路增广+当前弧优化

#include <bits/stdc++.h>
#define N 1000010
#define M 8000010
#define INF INT_MAX
using namespace std;
int n,m,s,t,fir[N],nxt[M],to[M],res[M],tot(1),dis[N],q[N],ans,cur[N];

inline int read(){
	int s=0; char c=getchar();
	while (!isdigit(c)) c=getchar();
	while (isdigit(c)) s=s*10+c-'0',c=getchar();
	return s;
}

inline void add(int u,int v,int w){
	to[++tot]=v; nxt[tot]=fir[u]; fir[u]=tot; res[tot]=w;
	to[++tot]=u; nxt[tot]=fir[v]; fir[v]=tot; res[tot]=0;
}

int dfs(int x,int limit){
	if (x==t || !limit)
		return limit;
	int i,flow,cnt(0);
	for (i=cur[x];i;i=nxt[i])
		if (dis[to[i]]==dis[x]+1 && res[i]){
		flow=dfs(to[i],min(limit-cnt,res[i]));
		cnt+=flow;
		res[i]-=flow,res[i^1]+=flow;
		if (cnt==limit)
			break;
	}
	if (cnt<limit)
		dis[x]=-1;
	cur[x]=i;
	return cnt;
}

bool bfs(int s){
	for (int i=1;i<=n;i++)
		dis[i]=-1; 
	int head(1),tail(1);
	for (dis[s]=1,q[1]=s;head<=tail;head++){
		int x=q[head];
		for (int i=fir[x];i;i=nxt[i])
			if (!~dis[to[i]] && res[i]){
				dis[to[i]]=dis[x]+1;
				if (to[i]==t)
					return 1;
				q[++tail]=to[i];
			}
	}
	return 0;
}

void dinic(){
	ans=0;
	while (bfs(s)){
		for (int i=1;i<=n;i++)
			cur[i]=fir[i];
		ans+=dfs(s,INF);
	}
}

int main(){
	n=read(),m=read(),s=read(),t=read();
	int u,v,w;
	for (int i=1;i<=m;i++){
		u=read(),v=read(),w=read();
		add(u,v,w);
	}
	dinic();
	printf("%d\n",ans);
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值