网络流
#include<cstdio> #include<algorithm> const int N=205,M=405,INF=0x3f3f3f; int m,n; int src,des,lev[N],cur[N]; int ecnt=1,adj[N],nxt[M],go[M],cap[M]; inline void addedge(const int &u,const int &v,const int &w) { nxt[++ecnt]=adj[u],adj[u]=ecnt,go[ecnt]=v,cap[ecnt]=w; nxt[++ecnt]=adj[v],adj[v]=ecnt,go[ecnt]=u,cap[ecnt]=0; } inline bool bfs() { static int qn,que[N]; int u,v,e; for(int i=src;i<=des;i++) lev[i]=-1,cur[i]=adj[i]; que[qn=1]=src;lev[src]=0; for(int ql=1;ql<=qn;ql++) { u=que[ql]; for(e=adj[u];e;e=nxt[e]) { if(cap[e]>0&&lev[v=go[e]]==-1) { lev[v]=lev[u]+1; que[++qn]=v; if(v==des) return true; } } } return false; } inline int dinic(const int &u,const int &flow) { if(u==des) return flow; int res=0,v,delta; for(int &e=cur[u];e;e=nxt[e]) { if(cap[e]>0&&lev[u]<lev[v=go[e]]) { delta=dinic(v,std::min(cap[e],flow-res)); if(delta) { cap[e]-=delta;cap[e^1]+=delta; res+=delta; if(res==flow) break; } } } if(res!=flow) lev[u]=-1; return res; } inline int maxflow() { int ans=0; while(bfs()) ans+=dinic(src,INF); return ans; } int main() { while(scanf("%d%d",&m,&n)!=EOF) { ecnt=1; for(int i=1;i<=n;i++) adj[i]=0; src=1,des=n; for(int i=1;i<=m;i++) { int u,v,w; scanf("%d%d%d",&u,&v,&w); addedge(u,v,w); } printf("%d\n",maxflow()); } return 0; }