1 //poj 1273 2 #include <iostream> 3 #include <cstdio> 4 #include <cstring> 5 #include <queue> 6 7 using namespace std; 8 #define MAXN 202 9 #define inf 0x7ffffff 10 #define Min(x,y) (x>y?y:x) 11 int n;//顶点数 12 int flow[MAXN][MAXN];//残量网络 13 int maxflow;//最大流 14 int st,en;//源点,汇点 15 int a[MAXN];//a[v]表示s-v的最小残量 16 int cap[MAXN][MAXN];//容量限制 17 int pre[MAXN];//记录父亲 18 19 int EK() 20 { 21 queue<int>q; 22 memset(flow,0,sizeof(flow));//初始时残量网络为0 23 maxflow=0; 24 while(1) 25 { 26 memset(a,0,sizeof(a)); 27 a[st]=inf; 28 q.push(st); 29 while(!q.empty()) 30 { 31 int u=q.front();q.pop(); 32 for(int v=1;v<=n;v++) 33 if(!a[v] && cap[u][v]>flow[u][v])//找到新节点v 34 { 35 pre[v]=u;q.push(v); 36 a[v]=Min(a[u],cap[u][v]-flow[u][v]); 37 } 38 } 39 if(a[en]==0) break;//找不到,则当前流已经是最大 40 for(int u=en;u!=st;u=pre[u])//从汇点往回走 41 { 42 flow[pre[u]][u]+=a[en]; 43 flow[u][pre[u]]-=a[en]; 44 } 45 maxflow+=a[en]; 46 } 47 return maxflow; 48 } 49 50 int main() 51 { 52 int m; 53 while(~scanf("%d%d",&m,&n)) 54 { 55 memset(cap,0,sizeof(cap)); 56 int u,v,c; 57 while(m--) 58 { 59 scanf("%d%d%d",&u,&v,&c); 60 cap[u][v]+=c; 61 } 62 st=1; 63 en=n; 64 printf("%d\n",EK()); 65 } 66 return 0; 67 }