//2021/3/31
//2021/4/1
#include <cstdio>
#include <cstring>
#include <queue>
#include <algorithm>
using namespace std;
typedef long long ll;
const ll INF=(1<<31);
const ll ma=10000005;
struct Node
{
ll v;
ll val;
ll nxt;
};
Node node[ma];
ll top=1;
ll n,m,s,t;
ll head[ma],inque[ma],dep[ma];
inline void add(ll u,ll v,ll w)
{
top++;
node[top].v=v;
node[top].val=w;
node[top].nxt=head[u];
head[u]=top;
}
inline bool bfs()
{
memset(dep,0x3f,sizeof(dep));
memset(inque,0,sizeof(inque));
dep[s]=0;
queue<ll>q;
q.push(s);
while(!q.empty())
{
ll u=q.front();
q.pop();
inque[u]=0;
for(register ll i=head[u];i;i=node[i].nxt)
{
ll d=node[i].v;
if(dep[d]>dep[u]+1 && node[i].val>0)
{
dep[d]=dep[u]+1;
if(inque[d]==0)
{
q.push(d);
inque[d]=1;
}
}
}
}
return dep[t]!=0x3f;
}
inline ll min(ll a,ll b)
{
return (a>b)?(b):(a);
}
inline ll dfs(int u,int flow)
{
ll rlow=0;
if(u==t)
{
return flow;
}
for(register ll i=head[u];i;i=node[i].nxt)
{
ll d=node[i].v;
if(dep[d]==dep[u]+1 && node[i].val>0)
{
if(rlow=dfs(d,min(node[i].val,flow)))
{
node[i].val-=rlow;
node[i^1].val+=rlow;
return rlow;
}
}
}
return 0;
}
ll maxflow;
inline ll Dinic()
{
ll lowflow;
while(bfs()==true)
{
while(lowflow=dfs(s,INF))
{
maxflow+=lowflow;
}
}
return maxflow;
}
int main()
{
scanf("%lld%lld%lld%lld",&n,&m,&s,&t);
for(register ll i=1;i<=m;i++)
{
ll u,v,w;
scanf("%lld%lld%lld",&u,&v,&w);
add(u,v,w);
add(v,u,0);
}
printf("%lld\n",Dinic());
return 0;
}
模板题【模板】最大流,不知道Dinic哪里错了