先挖个坑
https://www.cnblogs.com/SYCstudio/p/7260613.html
dinic 板子
#include <iostream>
#include <cstring>
#include <queue>
#include <algorithm>
#include <vector>
using namespace std;
const int N=300,inf=1<<30;
#define int long long
struct E{
int x,y,cap,flow;
E(int x,int y,int cap,int flow):x(x),y(y),cap(cap),flow(flow){
}
};
int n,m,S,T;
vector<E> edge;
vector<int> g[N];
int d[N],cur[N],vis[N];
void add(int x,int y,int cap){
edge.push_back(E(x,y,cap,0));
edge.push_back(E(y,x,0,0));
m=edge.size();
g[x].push_back(m-2);
g[y].push_back(m-1);
}
void init(){
m=0;
edge.clear();
for(int i=0;i<n;i++) g[i].clear();
}
void read_data(){
int tmp,x,y,z;
init();
cin>>n>>tmp>>S>>T;
for(int i=1;i<=tmp;i++) cin>>x>>y>>z,add(x,y,z);
}
int bfs(){
queue<int> q;
q.push(S);
d[S]=0;
memset(vis,0,sizeof vis);
vis[S]=1;
while(!q.empty()){
int x=q.front();
q.pop();
for(int i=0;i<g[x].size();i++){
E &e=edge[g[x][i]];
if(!vis[e.y]&&e.flow<e.cap){
vis[e.y]=1;
d[e.y]=d[x]+1;
q.push(e.y);
}
}
}
return vis[T];
}
int dfs(int x,int a){
if(x==T||a==0) return a;
int flow=0,t;
for(int &i=cur[x];i<g[x].size();i++){
E &e=edge[g[x][i]];
if(d[x]+1==d[e.y]&&(t=dfs(e.y,min(a,e.cap-e.flow)))>0){
e.flow+=t;
edge[g[x][i]^1].flow-=t;
flow+=t;
a-=t;
if(a==0) break;
}
}
return flow;
}
int max_flow(){
int flow=0;
while(bfs()){
memset(cur,0,sizeof cur);
flow+=dfs(S,inf);
}
return flow;
}
main(){
read_data();
cout<<max_flow()<<'\n';
}