http://acm.nyist.net/JudgeOnline/problem.php?pid=323
/*这是一道最基础的最大流问题,没运用什么转变思维,
用广搜寻找增广路的,听说深搜更好些
像这种简单流的问题,最核心的问题是寻找增广路
*/
#include <stdio.h>
#include <queue> // 广搜中用的队列
#include <iostream> //输入输出流
#include <string.h> //memset
#include <algorithm>//
using namespace std ;
int cap[205][205] ,flow[205][205] ;
//cap各条道路的可行流
//flow 各条道路真实流
void Read_map ( int N , int M) { // 读取cap
int u , v , c ;
memset (cap , 0 ,sizeof(cap)) ;
for ( int i = 0 ; i < N ; i++ ) {
cin >> u >> v >> c ;
cap[u][v] += c;//防止重边
}
}
long long Augument ( int N , int M ) {//寻找最大流
int path[205] , u , v;
long long f[205] , sum = 0 ;
queue < int > Q ;
memset (flow , 0 , sizeof (flow)) ;// 初始化流
while (1) {
memset ( f , 0 , sizeof(f) ) ;//初始化各节点的流
f[1] = 1<<30 ; //初始化源点
Q.push (1) ;
while ( !Q.empty() ) {//寻找增广路
u = Q.front () ; Q.pop() ;
for ( v = 2 ; v <= M ; v++) {
if ( !f[v] && cap[u][v] > flow[u][v] ) {
path[v] = u;Q.push (v);
int tem = cap[u][v] -flow[u][v] ;
if (f[u] > tem ) f[v] = tem ;
else f[v] = f[u] ;
}
}
}
if ( !f[M] ) break ;
for ( u = M ; u != 1 ; u = path[u] ) { //更新流
flow[path[u]][u] += f[M];//更新正向流
flow[u][path[u]] -= f[M] ; //更新反向流
}
sum += f[M] ;
}
return sum ;
}
int main() {
int N , M ;
long long sum;
while ( cin >> N >>M ) {
Read_map(N , M);
sum = Augument (N ,M) ;
cout << sum << endl ;
}
}