/*
最大流 Dinic
by sbn
2017-12-24
*/
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<string>
#include<queue>
#include<cstring>
#define min(x,y) ((x<y)?(x):(y))
#define rev(i)(i&1?(i+1):(i-1))
using namespace std;
typedef long long ll;
int dis[10005]; //分层图,距源点距离
int n,m,ans,st,ed;
struct node{
int x,y,len,nxt;
node(){}
node(int nx,int ny,int nlen,int nnxt){
x=nx;y=ny;len=nlen;nxt=nnxt;
}
} E[200010];
int head[10001],cnt;
int bfs(){
for (int i=1;i<=n;i++) dis[i]=-1;
queue<int> Q;
dis[st]=0;Q.push(st);
while (!Q.empty()){
int j=Q.front();
Q.pop();
for (int i=head[j];i;i=E[i].nxt)
if (dis[E[i].y]<0&&E[i].len>0){
dis[E[i].y]=dis[j]+1;
Q.push(E[i].y);
}
}
if (dis[ed]>0) return 1;
else return 0;
}
int find(int x,int low){
int res=0;
if (x==ed) return low;
for (int i=head[x];i;i=E[i].nxt)
if (E[i].len>0&&dis[E[i].y]==dis[x]+1&&(res=find(E[i].y,min(low,E[i].len))))
{
E[i].len-=res;
E[i^1].len+=res;
return res;
}
return 0;
}
inline void link(int x,int y,int z){
E[++cnt]=node(x,y,z,head[x]);
head[x]=cnt;
E[++cnt]=node(y,x,0,head[y]);
head[y]=cnt;
}
int main(){
scanf("%d%d%d%d",&n,&m,&st,&ed);
cnt=1;
for (int i=1;i<=m;i++)
{
int a,b,c;
scanf("%d%d%d",&a,&b,&c);
link(a,b,c);
}
ans=0;int tans=0;
while(bfs()){
while (tans=find(st,2e6)) ans+=tans;
}
printf("%d\n",ans);
return 0;
}
最大流Dinic(没有当前弧优化)
最新推荐文章于 2021-07-27 19:20:39 发布