1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57
|
#include <cstring> #include <algorithm> #include <queue> using namespace std; const int INF=0x7fffffff; const int MaxN=1001; int G[MaxN][MaxN]; int n,m,en; int s,t; int pre[MaxN],flw[MaxN]; int hd[MaxN]; inline int (int s,int t) { queue<int> Q; memset(pre,-1,sizeof pre); pre[s]=0; Q.push(s); flw[s]=INF; while(!Q.empty()) { int now=Q.front(); Q.pop(); if(now==t) break; for(int i=1;i<=n;++i) if(G[now][i]>0&&pre[i]==-1) pre[i]=now,flw[i]=min(flw[now],G[now][i]),Q.push(i); } return pre[t]==-1?-1:flw[t]; } int EK(int s,int t) { int sum=0; int maxflw=0; while((sum=bfs(s,t))!=-1) { int k=t; while(k!=s) { int lst=pre[k]; G[lst][k]-=sum; G[k][lst]+=sum; k=lst; } maxflw+=sum; } return maxflw; } int main(void) { int u,v,w; scanf("%d %d %d %d",&n,&m,&s,&t); for(int i=1;i<=m;++i) scanf("%d %d %d",&u,&v,&w),G[u][v]+=w; return printf("%d",EK(s,t)),0; }
|
近期评论