最大流模板(没有任何随机化),洛谷上每次会随机 RE 一到三个点。是什么鬼东西。
#include<bits/stdc++.h>
#define int long long
inline int read(){int res=0,flag=1;char c=getchar();
while(c<'0'||c>'9'){if(c=='-')flag=-1;c=getchar();}
while(c>='0'&&c<='9'){res=(res<<3)+(res<<1)+c-'0';c=getchar();}return res*flag;
}using namespace std;const int N=1e4+5,M=1e5+5,inf=0x3f3f3f3f3f3f3f3f;
queue<int>q;
int fir[N],cur[N],dep[N];bool vis[N],fi;
struct edge{int nxt,to,val;}e[M<<1];
int nn,mm,ss,tt,tot=1,maxflow;
inline void add(int u,int v,int w){e[++tot]=(edge){fir[u],v,w};fir[u]=tot;}
bool bfs(){
for(int i=1;i<=nn;++i) dep[i] = inf, cur[i] = fir[i];
q.push(ss); dep[ss] = 0;
while( !q.empty() ){
int u = q.front(); q.pop();
for(int i=fir[u];i;i=e[i].nxt){
int v = e[i].to;
if( dep[v]==inf && e[i].val )
dep[v] = dep[u]+1, q.push(v);
}
}
return dep[tt] != inf;
}
bool finds;
int dfs(int u,int low){
if( u==tt ) { maxflow += low; finds=1; return low;}
int rlow = 0, used = 0;
for(int i=cur[u];i;i=e[i].nxt){
int v = e[ cur[u] = i ].to;
if( dep[v] == dep[u]+1 && e[i].val )
if( rlow = dfs(v, min(low-used,e[i].val) ) ){
e[i].val -= rlow, e[i^1].val +=rlow;
used += rlow; if( used==low ) break;
}
}
return used;
}
int dinic(){
while( bfs() )
while( dfs(ss,inf/2) );
return maxflow;
}
signed main(){
nn = read(), mm = read(), ss = read(), tt = read();
for(int i=1;i<=mm;++i){
int u = read(), v = read(), w = read();
add(u,v,w), add(v,u,0);
}
printf("%lld\n",dinic());
return 0;
}