模板-网络最大流

题目在这里

#include<bits/stdc++.h>
#define inf 1000000007
using namespace std;

const int maxm=200005;
const int maxn=20005;

struct node{
	int next,v,c;
}edge[maxm];
int head[maxn],tot=1,d[maxn],ans,s,t,n,m;
queue<int> q;

void add(int u,int v,int c)
{
	edge[++tot].next=head[u]; edge[tot].v=v; edge[tot].c=c; head[u]=tot;
}

bool bfs()
{
	memset(d,0,sizeof(d));
	while(q.size())q.pop();
	q.push(s);d[s]=1;
	while(q.size()){
		int u=q.front();q.pop();
		for(int i=head[u];i;i=edge[i].next){
			int v=edge[i].v;
			if(edge[i].c && !d[v]){
				d[v]=d[u]+1;
				q.push(v);
				if(v==t)return 1;
			}
		}
	}
	return 0;
}

int Dinic(int u,int minf)
{
	if(u==t || !minf)return minf;
	int f=0,k;
	for(int i=head[u];i;i=edge[i].next){
		int v=edge[i].v;
		if(d[v]==d[u]+1 && (k=Dinic(v,min(edge[i].c,minf)))){
			edge[i].c-=k;
			edge[i^1].c+=k;
			f+=k;
			minf-=k;
			if(!minf)break;
		}
	}
	return f;
}

int main()
{
	scanf("%d %d %d %d",&n,&m,&s,&t);
	for(int i=1;i<=m;++i){
		int a,b,c;
		scanf("%d %d %d",&a,&b,&c);
		add(a,b,c);
		add(b,a,0);
	}
	while(bfs())
	  ans+=Dinic(s,inf);
	  
	printf("%d",ans);
	return 0;
}

猜你喜欢

转载自blog.csdn.net/guoyangfan_/article/details/83512494