版权声明:本文为博主原创文章。 https://blog.csdn.net/qq_37657307/article/details/86689657
#include<bits/stdc++.h>
using namespace std;
#define INF 0x3f3f3f3f
struct mzls
{
int to,cap,rev;
mzls(){}
mzls(int a,int b,int c)
{
to=a,cap=b,rev=c;
}
};
vector<mzls>g[10005];
int n,m,s,t;
int lev[10005],iter[10005];
inline void bfs(int s)
{
memset(lev,-1,sizeof(lev));
queue<int>que;
lev[s]=0;
que.push(s);
while(!que.empty())
{
int x=que.front();
que.pop();
int l1=g[x].size();
for(int i=0;i<l1;i++)
{
mzls &ml=g[x][i];
if(ml.cap>0&&lev[ml.to]<0)
{
lev[ml.to]=lev[x]+1;
que.push(ml.to);
}
}
}
}
inline int dfs(int x,int ml)
{
if(x==t)
return ml;
int l1=g[x].size();
for(int &i=iter[x];i<l1;i++)
{
mzls &as=g[x][i];
if(as.cap<=0||lev[as.to]<=lev[x])
continue;
int x1=dfs(as.to,min(ml,as.cap));
if(x1>0)
{
as.cap-=x1;
g[as.to][as.rev].cap+=x1;
return x1;
}
}
return 0;
}
inline int max_flow(int s,int t)
{
int ret=0;
for(;;)
{
bfs(s);
if(lev[t]<0)
return ret;
memset(iter,0,sizeof(iter));
int x1;
while((x1=dfs(s,INF))>0)
ret+=x1;
}
}
int main()
{
scanf("%d%d%d%d",&n,&m,&s,&t);
for(int i=1;i<=m;i++)
{
int x,y,z;
scanf("%d%d%d",&x,&y,&z);
g[x].push_back(mzls(y,z,g[y].size()));
g[y].push_back(mzls(x,0,g[x].size()-1));
}
printf("%d",max_flow(s,t));
}