https://blog.csdn.net/x_y_q_/article/details/51999466
#include <iostream>
#include <cstring>
#include <cstdio>
#include<queue>
#define fi first
#define se second
#define show(a) cout<<a<<endl;
#define show2(a,b) cout<<a<<" "<<b<<endl;
#define show3(a,b,c) cout<<a<<" "<<b<<" "<<c<<endl;
using namespace std;
int const inf = 0x3f3f3f3f;
int const MAX = 205;
int n, m;
int c[MAX][MAX], dep[MAX];//dep[MAX]代表当前层数
int bfs ( int s, int t ) //重新建图,按层次建图
{
queue<int> q;
while ( !q.empty() )
q.pop();
memset ( dep, -1, sizeof ( dep ) );
dep[s] = 0;
q.push ( s );
while ( !q.empty() )
{
int u = q.front();
q.pop();
for ( int v = 1; v <= m; v++ )
{
if ( c[u][v] > 0 && dep[v] == -1 ) //如果可以到达且还没有访问,可以到达的条件是剩余容量大于0,没有访问的条件是当前层数还未知
{
dep[v] = dep[u] + 1;
q.push ( v );
}
}
}
return dep[t] != -1;
}
int dfs ( int u, int mi, int t ) //查找路径上的最小流量
{
if ( u == t )
return mi;
int tmp;
for ( int v = 1; v <= m; v++ )
{
if ( c[u][v] > 0 && dep[v] == dep[u] + 1 && ( tmp = dfs ( v, min ( mi, c[u][v] ), t ) ) )
{
c[u][v] -= tmp;
c[v][u] += tmp;
return tmp;
}
}
return 0;
}
int dinic()
{
int ans = 0, tmp;
while ( bfs ( 1, m ) )
{
while ( 1 )
{
tmp = dfs ( 1, inf, m );
if ( tmp == 0 )
break;
ans += tmp;
}
}
return ans;
}
int main()
{
while ( ~scanf ( "%d %d", &n, &m ) )
{
memset ( c, 0, sizeof ( c ) );
int u, v, w;
while ( n-- )
{
scanf ( "%d %d %d", &u, &v, &w );
c[u][v] += w;
}
printf ( "%d\n", dinic() );
}
return 0;
}