爆0求助
/*
name: luogu B3606
algorithm: ISAP
copyright: Soul_direction
*/
#include <iostream>
#include <cmath>
#include <cstdio>
#include <algorithm>
#include <queue>
#include <string.h>
#define maxv 20010
#define maxe 500010
#define inf 1000000000000000
using namespace std;
typedef long long int ll;
struct edge{
public:
int to,nxt;
ll val;
};
int cnt=0,head[maxv];
int n,m,s,t;
vector<edge>list(maxe);
int dep[maxv],gap[maxv],cur[maxv];
queue<int> q;
ll sum=0;
inline int read(){
int x=0,f; char ch=0;
while(!isdigit(ch)) f=(ch=='-'?-1:1),ch=getchar();
while(isdigit(ch)) x=(x<<1)+(x<<3)+(ch^48),ch=getchar();
return x*f;
}// 快读
inline void add(int toi,int next,ll w){
list[cnt].to=next;
list[cnt].val=w;
list[cnt].nxt=head[toi];
head[toi]=cnt;++cnt;
}// 链式前向星加边
inline void init(){
memset(dep,-1,maxv*sizeof(int));
memcpy(cur,head,(n+1)* sizeof(int));
}// 初始化
inline void bfs(){
q.push(t);
dep[t]=0;
++gap[dep[t]];
while(!q.empty()){
int fro=q.front();
q.pop();
for(register int i=head[fro];i!=-1;i=list[i].nxt){
int ito=list[i].to;
if(dep[i]==-1){
dep[i]=dep[fro]+1;
q.push(ito);
++gap[dep[ito]];
}
}
}
return;
}
ll dfs(int u,ll fo){
if(u==t||fo==0)return fo;
ll used=0,wer=0;
for(int i=cur[u];i!=-1;i=list[u].nxt){
cur[u]=i;
if(dep[u]==dep[list[i].to]+1&&list[i].val>0){
wer=dfs(list[i].to,min(fo-used,list[i].val));
if(wer){
list[i].val-=wer;
list[i^1].val+=wer;
used+=wer;
}
}
if(used==fo)return used;
}
if(used>fo)used=fo;
if(used<fo){
--gap[dep[u]];
if(!gap[dep[u]])dep[s]=n+1;
++gap[++dep[u]];
}
return used;
}
ll ISAP(){
init();
bfs();
while(dep[s]<n){
sum+=dfs(s,inf);
memcpy(cur,head,(n-1)*sizeof(int));
}
return sum;
}
int main(){
ios::sync_with_stdio(0);
n=read(),m=read(),s=read(),t=read();
memset(head,-1,maxv*sizeof(int));
for(ll i=1,u,v,w;i<=m;i++){
u=read(),v=read(),w=read();
add(u,v,w);
add(v,u,0);
}
cout<<ISAP();
return 0;
}