首页 > 其他分享 >网络流-最大流

网络流-最大流

时间:2025-01-23 08:59:39浏览次数:1  
标签:head mf return 最大 idx int 网络 dis

Dinic算法

点击查看代码
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e4+10;
int n,m,s,t,idx=1,head[N],cur[N],dis[N];//idx初始为1,从2.3开始配对 
struct node{
	int u,v,w,nxt;
}g[N];
void add(int u,int v,int w){
	g[++idx]={u,v,w,head[u]};head[u]=idx;
	g[++idx]={v,u,0,head[v]};head[v]=idx;//反向建边 
}
bool bfs(){//寻找增广路 
	memset(dis,0,sizeof(dis));
	queue<int>q;q.push(s);dis[s]=1;
	while(!q.empty()){
		int u=q.front();q.pop(); 
		for(int i=head[u];i;i=g[i].nxt){
			int v=g[i].v;
			if(dis[v]==0&&g[i].w){
				dis[v]=dis[u]+1;
				q.push(v);
				if(v==t) return 1;
			}
		}
	} 
	return 0;
}
int dfs(int u,int mf){//多路增广 
	if(u==t) return mf;
	int sum=0;
	for(int &i=cur[u];i;i=g[i].nxt){//当前弧优化 
		int v=g[i].v;
		if(dis[v]==dis[u]+1&&g[i].w){
			int f=dfs(v,min(mf,g[i].w));
			g[i].w-=f;
			g[i^1].w+=f;
			sum+=f;//累加流出流量 
			mf-=f;//减少流量剩余 
			if(mf==0) break;//如果没流量了就停止 
		}
	}
	if(sum==0) dis[u]=0;//残枝优化,删点 
	return sum;
}
int dinic(){//将可行流累加 
	int ans=0;
	while(bfs()){
		memcpy(cur,head,sizeof(head));
		ans+=dfs(s,1e9);//初始可行流流量为无穷大 
	}
	return ans;
}
signed main(){
	cin>>n>>m>>s>>t;
	for(int i=1;i<=m;i++){
		int u,v,w;cin>>u>>v>>w;
		add(u,v,w);
	}
	cout<<dinic();
    return 0;
}

标签:head,mf,return,最大,idx,int,网络,dis
From: https://www.cnblogs.com/bssmessi/p/18687058

相关文章