https://daniu.luogu.org/problem/show?pid=3376
代码
#include<cstdio>
#include<iostream>
#include<cstring>
#include<cmath>
#include<queue>
using namespace std;
const int maxx=10001;
int n,m,s,t,flow=0;
int be[maxx],ne[maxx*20],to[maxx*20],w[maxx*20],dep[maxx],e=1;
void add(int x,int y,int z){
to[++e]=y;
ne[e]=be[x];
be[x]=e;
w[e]=z;
}
bool bfs(){
queue<int> q;
q.push(s);
memset(dep,0,sizeof(dep));
dep[s]=1;
while(!q.empty()){
int now=q.front();
q.pop();
for(int i=be[now];i;i=ne[i]){
int go=to[i];
if(!dep[go] && w[i]>0){
// printf("%d~%d\n",go,w[i]);
dep[go]=dep[now]+1;
q.push(go);
}
}
}
return !dep[t]?0:1;
}
int dfs(int id,int mini){
if(id==t || !mini)return mini;
int flow,ret=0;
for(int i=be[id];i;i=ne[i]){
int go=to[i];
if(w[i]>0 && dep[go] == dep[id]+1 && (flow=dfs(go,min(mini,w[i])))){
w[i]-=flow;
w[i^1]+=flow;
ret+=flow;
mini-=flow;
}
if(!mini)return ret;
}
return ret;
}
int dinic(){
int ans=0;
while(bfs()){
while(1){
int tmp=dfs(s,1e9);
if(!tmp)break;
ans+=tmp;
// printf("%d\n",tmp);
}
}
return ans;
}
int read(){
char x;
while((x=getchar())<'0' || x>'9');
int u=x-'0';
while((x=getchar())>='0' && x<='9')u=u*10+x-'0';
return u;
}
int main(){
#ifndef ONLINE_JUDGE
freopen("input.in","r",stdin);
freopen("output.out","w",stdout);
#endif
int i,j,k;
n=read();
m=read();
s=read();
t=read();
while(m--){
i=read();
j=read();
k=read();
add(i,j,k);
add(j,i,0);
}
printf("%d",dinic());
return 0;
}