#include<stdio.h> #include<string.h> #include<queue> using namespace std; int map[201][210]; int n,m; int f[210]; int pre[210]; int bfs()//广搜找增广路径 { queue<int>q; int top,i; memset(pre,-1,sizeof(pre));//置前驱 f[1]=999999999;//流到这儿的可增大的流 q.push(1); pre[1]=0; while(!q.empty()) { top=q.front(); q.pop(); if(top==m) break; for(i=1;i<=m;i++) { if(pre[i]==-1&&map[top][i])//未访问,可流 { f[i]=f[top]<map[top][i]?f[top]:map[top][i]; pre[i]=top; q.push(i); } } } if(pre[m]==-1) return 0;//若为访问到汇点 return f[m]; } int ek() { int maxf=0,addf,cur,pree; while(addf=bfs(),addf!=0)//若找到增广路径 { maxf+=addf; cur=m; while(cur!=1)//修改残留网络 { pree=pre[cur]; map[pree][cur]-=addf;//正向的因占用流,其残余流减少 map[cur][pree]+=addf;//其反向的,表示可改流增加 cur=pree; } } return maxf; } int main() { int ret,i,u,v,c; while(scanf("%d%d",&n,&m)!=EOF) { memset(map,0,sizeof(map)); for(i=0;i<n;i++) { scanf("%d%d%d",&u,&v,&c); map[u][v]+=c;//流是有向的 } ret=ek(); printf("%d\n",ret); } return 0; }