就是EK的思想
#include<bits/stdc++.h>
#define MAXN 10005
using namespace std;
int n,m,s,t;
int tot = (-1) , h[MAXN] , dep[MAXN] , vis[MAXN];
struct node{
int from,to,next,rest;
}e[MAXN * 20];
void add(int x , int y , int z){
tot++;
e[tot].from = x;
e[tot].to = y;
e[tot].rest = z;
e[tot].next = h[x];
h[x] = tot;
}
int bfs(){
memset(dep , 0x3f , sizeof(dep));
memset(vis , -1 , sizeof(vis));
queue<int>q;q.push(s);dep[s] = 0;
vis[s] = 1;int now;
while(!q.empty()){
now = q.front();vis[now] = (-1);q.pop();
for(int i = h[now] ; i != (-1) ; i = e[i].next){
if(!e[i].rest)continue;
if(dep[e[i].to] < dep[now] + 1)continue;
dep[e[i].to] = dep[now] + 1;
if(vis[e[i].to] != (-1))continue;
q.push(e[i].to);
}
}
if(dep[t] > 999999)return (-1);
return 1;
}
// dfsÕÒÿ´ÎµÄ·Ö²ã×î¶Ì·£¬²¢Çҵݹé¹ýÈ¥×îСֵ
int dfs(int now , int dx){
if(now == t)return dx;
for(int i = h[now] ; i != (-1) ; i = e[i].next){
if(e[i].rest && dep[e[i].to] == dep[now] + 1){
int res = dfs(e[i].to , min(dx , e[i].rest));
if(!res)continue;
e[i].rest -= res;
e[i ^ 1].rest += res;
return res;
}
}
return 0;
}
int dinic(){
int maxl = 0;
while(bfs() != (-1)){
maxl += dfs(s , 99999999);
}
return maxl;
}
int main(){
memset(h , -1 , sizeof(h));
cin>>n>>m>>s>>t;
for(int i = 1 ; i <= m ; i++){
int x,y,z;
scanf("%d%d%d" , &x , &y , &z);
add(x , y , z);
add(y , x , 0);
}
cout<<dinic()<<endl;
}