很好的一篇博客: https://www.cnblogs.com/rmy020718/p/9546071.html
#include <iostream>
#include <math.h>
#include <stdlib.h>
#include <cstring>
#include <stdio.h>
#include <queue>
#include <algorithm>
#include <vector>
#include <map>
#include <set>
#include <string>
#define MAX 10010
#define INF 0x3f3f3f3f
#define EXP 1e-9
using namespace std;
typedef long long ll;
int m,n,s,t;
int tot;
int head[MAX];
struct node{
int nxt,to,w;
}e[MAX*100];
int dis[MAX];
queue<int>q;
inline void adde(int x,int y,int z){
e[tot].nxt=head[x];
e[tot].to=y;
e[tot].w=z;
head[x]=tot++;
}
bool bfs(){
memset(dis,-1,sizeof(dis));
dis[s]=0;
q.push(s);
while(!q.empty()){
int x=q.front();
q.pop();
for(int i=head[x];i!=-1;i=e[i].nxt){
int y=e[i].to;
if(dis[y]==-1&&e[i].w>0){
dis[y]=dis[x]+1;
q.push(y);
}
}
}
return dis[t]!=-1;
}
int dfs(int x,int inf){
if(x==t)return inf;
int flow=0;
int tmp=0;
for(int i=head[x];i!=-1;i=e[i].nxt){
int y=e[i].to;
if(dis[y]==dis[x]+1&&e[i].w>0){
tmp=dfs(y,min(inf,e[i].w));
if(!tmp)continue;
inf-=tmp;
flow+=tmp;
e[i].w-=tmp;
e[i^1].w+=tmp;
if(!inf)break;
}
}
return flow;
}
int main(){
int a,b,c;
scanf("%d%d%d%d",&n,&m,&s,&t);
tot=0;
memset(head,-1,sizeof(head));
for(int i=1;i<=m;i++){
scanf("%d%d%d",&a,&b,&c);
adde(a,b,c);
adde(b,a,0);
}
int ans=0;
while(bfs())ans+=dfs(s,INF);
printf("%d\n",ans);
return 0;
}