。。。在洛谷上过了,交到 uoj 就挂了。。。
不知道为什么 RE 了
// Problem: P4722 【模板】最大流 加强版 / 预流推进
// Contest: Luogu
// URL: https://www.luogu.com.cn/problem/P4722
// Memory Limit: 500 MB
// Time Limit: 1500 ms
#include<stdio.h>
#include<stack>
const int maxn=1200,maxm=120000,inf=0x7f7f7f7f;
struct{
int v;long long c;int nxt;
}edge[maxm<<1];
int head[maxn|1],ht[maxn|1],gap[maxn<<1|1],lv,n,s,t,mp[maxn|1][maxn|1];
long long ex[maxn|1];
std::stack<int>stk[maxn<<1|1];
inline int min(int x,int y){return x>y?y:x;}
inline int max(int x,int y){return x>y?x:y;}
inline void addedge(int u,int v,long long c){
static int tot=0;
if(~mp[u][v])edge[mp[u][v]].c+=c;
else{
edge[tot]={v,c,head[u]},mp[u][v]=head[u]=tot++;
edge[tot]={u,0,head[v]},head[v]=tot++;
}
}
bool push(int u){
int v;long long c;
for(int i=head[u];~i;i=edge[i].nxt){
v=edge[i].v,c=edge[i].c;
if(!c||ht[u]!=ht[v]+1)continue;
c=ex[u]>c?c:ex[u];
if(v!=s&&v!=t&&!ex[v])stk[ht[v]].push(v),lv=max(lv,ht[v]);
ex[u]-=c,ex[v]+=c,edge[i].c-=c,edge[i^1].c+=c;
if(!ex[u])return 0;
}
return 1;
}
void relabel(int u){
ht[u]=inf;
for(int i=head[u];~i;i=edge[i].nxt)if(edge[i].c)ht[u]=min(ht[u],ht[edge[i].v]);
if(++ht[u]<n)stk[ht[u]].push(u),lv=max(lv,ht[u]),++gap[ht[u]];
}
bool bfs(){
for(int i=1;i<=n;++i)ht[i]=inf;
static int q[maxn];
int l=0,r=0;q[r++]=t,ht[t]=0;
for(;l<r;++l)
for(int i=head[q[l]];~i;i=edge[i].nxt){
if(q[l]==t&&edge[i].v==s)ex[t]+=edge[i^1].c;
else if(edge[i^1].c&&ht[edge[i].v]==inf)
ht[edge[i].v]=ht[q[l]]+1,q[r++]=edge[i].v;
}
return ht[s]!=inf;
}
int maxht(){
for(;(~lv)&&stk[lv].empty();--lv);
return (~lv)?stk[lv].top():0;
}
long long HLPP(){
if(!bfs())return ex[t];
for(int i=0;i<n;++i)gap[i]=0;
for(int i=1;i<=n;++i)if(ht[i]<n)++gap[ht[i]];
ht[s]=n;
for(int i=head[s];~i;i=edge[i].nxt)
if(edge[i].c){
if(edge[i].v!=t&&!ex[edge[i].v])
stk[ht[edge[i].v]].push(edge[i].v),lv=max(lv,ht[edge[i].v]);
ex[edge[i].v]+=edge[i].c,edge[i^1].c=edge[i].c,edge[i].c=0;
}
for(int u;u=maxht();){
stk[lv].pop();
if(push(u)){
if(!(--gap[ht[u]]))
for(int i=1;i<=n;i++)
if(i!=s&&i!=t&&ht[i]>ht[u])
ht[i]=max(ht[i],n+1);
relabel(u);
}
}
return ex[t];
}
int main(){
int m,u,v;long long c;
scanf("%d%d%d%d",&n,&m,&s,&t);
for(int i=1;i<=n;head[i++]=-1)for(int j=1;j<=n;++j)mp[i][j]=-1;
for(;m--;addedge(u,v,c))scanf("%d%d%lld",&u,&v,&c);
printf("%lld",HLPP());
return 0;
}