第一个样例 WA 了,输出 15,第二个样例 TLE 了
// 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=0x7fffffff;
struct{
int v,c,nxt;
}edge[maxm<<1];
int head[maxn|1],ht[maxn|1],ex[maxn|1],gap[maxn],lv,n,s,t;
std::stack<int>stk[maxn];
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,int c){
static int tot=0;
edge[tot]={v,c,head[u]},head[u]=tot++;
edge[tot]={u,c,head[v]},head[v]=tot++;
}
bool push(int u){
int v,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=min(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]+1);
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(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;
}
int HLPP(){
if(!bfs())return 0;
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,c;
scanf("%d%d%d%d",&n,&m,&s,&t);
for(int i=1;i<=n;++i)head[i]=-1;
for(;m--;addedge(u,v,c))scanf("%d%d%d",&u,&v,&c);
printf("%d",HLPP());
return 0;
}