(http://acm.hdu.edu.cn/showproblem.php?pid=1532)
//poj1273,hdoj1532模板代码 注意重边!
//s为源点,t为汇点,f为s-t净流量
#include <iostream>
#include <queue>
#include <string.h>
#define N 250
#define MaxInt 0x3f3f3f3f
using namespace std;
int m,n,flow[N][N],cap[N][N],a[N],p[N];
queue<int> q;
int MaxFlow(int s,int t)
{
int f,u,v;
memset(flow,0,sizeof(flow));
f=0;
while(1)
{
memset(a,0,sizeof(a));
a[s]=MaxInt;
q.push(s);
//BFS找增广路
while(!q.empty())
{
u=q.front();q.pop();//u为队头元素
for(v=1;v<=m;v++)
{
if(!a[v]&&cap[u][v]>flow[u][v])//找到新结点v
{
p[v]=u;q.push(v);//记录v的父亲,并加入FIFO队列
a[v]=a[u]<cap[u][v]-flow[u][v]?a[u]:cap[u][v]-flow[u][v];
//a[v]为s-v路径上的最小流量
}
}
}
if(a[t]==0)//a[m]==0
break;//找不到,则当前已是最大流量
for(v=t;v!=s;v=p[v])//从汇点回溯
{
flow[p[v]][v]+=a[t];//更新正向流量
flow[v][p[v]]-=a[t];//更新反向流量
}
f+=a[t];//更新从s流出的总流量
}
return f;
}
int main()
{
int u,v,i,c,ans;
while(scanf("%d%d",&n,&m)!=EOF)
{
memset(cap,0,sizeof(cap));
for(i=0;i<n;i++)
{
scanf("%d%d%d",&u,&v,&c);
cap[u][v]+=c;
}
ans=MaxFlow(1,m);
printf("%d\n",ans);
}
return 0;
}