Dinic算法:
// ShellDawn
// POJ1273
// No.15
#include<cstdio>
#include<iostream>
#include<cstring>
#include<queue>
#define MM(x) memset(x,0,sizeof(x))
#define INF 0x3f3f3f3f
using namespace std;
#define maxn 205
int n,m;
int E[maxn][maxn]; // 流量
int V[maxn]; // 层次
// 层次邻接表
int P[maxn][maxn][2];
int C[maxn];
// END
int maxflow;
// 通过层次V,BFS为DFS提供邻接表
bool BFS(int s){
MM(V);MM(P);MM(C);
queue<int> q;
q.push(s);
V[s] = 1;
while(!q.empty()){
int loc = q.front();
q.pop();
for(int i=1;i<=n;i++){
if(V[i] == 0 && E[loc][i] > 0){
V[i] = V[loc]+1;
q.push(i);
P[loc][C[loc]][0] = i;
P[loc][C[loc]][1] = E[loc][i];
C[loc]++;
if(i==n) return true;
}
}
}
return false;
}
// DFS修改流量
int DFS(int now,int minflow){
if(now == n) return minflow;
int flow = 0;
for(int i=0;i<C[now];i++){
int next = P[now][i][0];
int v = P[now][i][1];
int f = DFS(next,min(v,minflow));
E[next][now] += f;
E[now][next] -= f;
minflow -= f;
flow += f;
}
return flow;
}
void Dinic(){
maxflow = 0;
while(BFS(1)){
maxflow += DFS(1,INF);
}
cout<<maxflow<<endl;
}
int main(){
while(~scanf("%d%d",&m,&n)){
MM(E);
int a,b,v;
for(int i=0;i<m;i++){
cin>>a>>b>>v;
E[a][b] += v;
}
Dinic();
}
return 0;
}