模板题: 洛谷3376(https://www.luogu.org/problem/P3376) POJ:Drainage Ditches(http://poj.org/problem?id=1273)
代码:
#include <bits/stdc++.h> using namespace std; typedef long long ll; const int maxn = 1e4 + 3; const int INF = 0x3f3f3f3f; ll n,head[maxn],minflow[maxn],pre[maxn],vis[maxn],tot,maxflow; struct Edge { ll to,w,Next; }edge[maxn*20]; void add(ll x,ll y,ll z) { edge[++tot].to=y,edge[tot].w+=z,edge[tot].Next=head[x],head[x]=tot; edge[++tot].to=x,edge[tot].Next=head[y],head[y]=tot; } bool bfs(ll s,ll t) { for(ll i=0;i<=n;i++) vis[i]=0; queue<ll> q; q.push(s); vis[s]=1,minflow[s]=INF; while(!q.empty()) { ll x=q.front(),y; q.pop(); for(ll i=head[x];i;i=edge[i].Next) { y=edge[i].to; if(edge[i].w&&!vis[y]) { minflow[y]=min(minflow[x],edge[i].w); pre[y]=i,vis[y]=1; q.push(y); if(y==t) return true; } } } return false; } void update(ll s,ll t) { ll now=t; while(now!=s) { ll i=pre[now]; edge[i].w-=minflow[t]; edge[i^1].w+=minflow[t]; now=edge[i^1].to; } maxflow+=minflow[t]; } int main() { ll m,s,t; while(~scanf("%lld%lld%lld%lld",&n,&m,&s,&t)) { ll x,y,z; maxflow=0,tot=1; for(ll i=0;i<=n;i++) head[i]=pre[i]=minflow[i]=0; for(ll i=0;i<=max(n*2,m);i++) edge[i].w=edge[i].Next=0; for(ll i=1;i<=m;i++) { scanf("%lld%lld%lld",&x,&y,&z); add(x,y,z); } while(bfs(s,t)) update(s,t); printf("%lld\n",maxflow); } return 0; }