#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
今日推荐
周排行