Dinic求助
  • 板块学术版
  • 楼主Coros_Trusds
  • 当前回复8
  • 已保存回复8
  • 发布时间2021/4/1 14:06
  • 上次更新2023/11/5 01:17:04
查看原帖
Dinic求助
430409
Coros_Trusds楼主2021/4/1 14:06
//2021/3/31

//2021/4/1

#include <cstdio>

#include <cstring>

#include <queue>

#include <algorithm>

using namespace std;

typedef long long ll;

const ll INF=(1<<31);

const ll ma=10000005;

struct Node
{
	ll v;
	
	ll val;
	
	ll nxt;
};

Node node[ma];

ll top=1;

ll n,m,s,t;

ll head[ma],inque[ma],dep[ma];

inline void add(ll u,ll v,ll w)
{
	top++;
	
	node[top].v=v;
	
	node[top].val=w;
	
	node[top].nxt=head[u];
	
	head[u]=top;
}

inline bool bfs()
{
	memset(dep,0x3f,sizeof(dep));
	
	memset(inque,0,sizeof(inque));
	
	dep[s]=0;
	
	queue<ll>q;
	
	q.push(s); 
	
	while(!q.empty())
	{
		ll u=q.front();
		
		q.pop();
		
		inque[u]=0;
		
		for(register ll i=head[u];i;i=node[i].nxt)
		{
			ll d=node[i].v;
			
			if(dep[d]>dep[u]+1 && node[i].val>0)
			{
				dep[d]=dep[u]+1;
				
				if(inque[d]==0)
				{
					q.push(d);
					
					inque[d]=1;
				}
			}
		}
	}
	
	return dep[t]!=0x3f;
}

inline ll min(ll a,ll b)
{
	return (a>b)?(b):(a);
}

inline ll dfs(int u,int flow)
{
	ll rlow=0;
	
	if(u==t)
	{
		return flow;
	}
	
	for(register ll i=head[u];i;i=node[i].nxt)
	{
		ll d=node[i].v;
		
		if(dep[d]==dep[u]+1 && node[i].val>0)
		{
			if(rlow=dfs(d,min(node[i].val,flow)))
			{
				node[i].val-=rlow;
				
				node[i^1].val+=rlow;
				
				return rlow;
			}
		}
	}
	
	return 0;
}

ll maxflow;

inline ll Dinic()
{
	ll lowflow;
	
	while(bfs()==true)
	{
		while(lowflow=dfs(s,INF))
		{
			maxflow+=lowflow;
		}
	}
	
	return maxflow;
}

int main()
{
	scanf("%lld%lld%lld%lld",&n,&m,&s,&t);
	
	for(register ll i=1;i<=m;i++)
	{
		ll u,v,w;
		
		scanf("%lld%lld%lld",&u,&v,&w);
		
		add(u,v,w);
		
		add(v,u,0);
	}
	
	printf("%lld\n",Dinic());
	
	return 0;
}

模板题【模板】最大流,不知道Dinic哪里错了

2021/4/1 14:06
加载中...