#include <iostream>#include<cstdlib>#include<stdio.h>#include<map>#include<cstring>#include<math.h>#include<stdlib.h>#definell Long Long#defineINF 0x3f3f3f3f#defineCLE (a) memset (A,0,sizeof (a))using namespacestd;structg{intV,cap,next;} e[600010];intpre[1100],l,d[1100],p[1100];intq[1100];voidinit () {L=0; memset (PRE,-1,sizeofpre);}voidAddintUintVintcap) {E[L].V=v; E[l].cap=cap; E[l].next=Pre[u]; Pre[u]=l++;}BOOLBFsintSintEintN) { intI,u,v,head,tail; for(i=0; i<=n;i++) d[i]=-1; Head=tail=0; D[s]=0; Q[tail]=s; while(head<=tail) {u=q[head++]; for(i=pre[u];i+1; i=E[i].next) {v=e[i].v; if(d[v]==-1&&E[i].cap>0) {D[v]=d[u]+1; q[++tail]=v; } } } return(d[e]!=-1);}intDfsintUint&e,intf) { if(u==e| | f==0)returnF; intflow=0, TMP; for(;p [u]+1;p [u]=E[p[u]].next) {G& en=E[p[u]]; if(d[u]+1==D[EN.V]) {tmp=Dfs (En.v,e,min (f,en.cap)); if(tmp>0) {En.cap-=tmp; E[p[u]^1].cap+=tmp; Flow+=tmp; F-=tmp; if(f==0) Break; } } } returnflow;}intDinic (intSintEintN) { inti,ans=0; while(BFS (s,e,n)) { for(i=0; i<=n;i++) p[i]=Pre[i]; Ans+=DFS (S,e,inf); } returnans;}intx,y,w;intMain () {intn,m; while(cin>>m>>N) {init (); for(intI=1; i<=m;i++) {scanf ("%d%d%d",&x,&y,&W); Add (X,Y,W); Add (Y,x,0); } printf ("%d\n", Dinic (1, N,n)); //Source point 1 meeting point n } return 0;}
Network Flow dinic Template