https://www.cnblogs.com/jackge/archive/2013/04/10/3012182.html
#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
const int VM=220;
const int INF=0x3f3f3f3f;
int n,m,src,des;
int map[VM][VM],dep[VM]; //dep[i]表示當前點到起點src的層數
int BFS(){ // 重新建圖(按層數建圖)
queue<int> q;
while(!q.empty())
q.pop();
memset(dep,-1,sizeof(dep));
dep[src]=0;
q.push(src);
while(!q.empty()){
int u=q.front();
q.pop();
for(int v=1;v<=m;v++)
if(map[u][v]>0 && dep[v]==-1){ // 如果可以到達且還沒有訪問
dep[v]=dep[u]+1;
q.push(v);
}
}
return dep[des]!=-1;
}
int DFS(int u,int minx){ // 查找路徑上的最小的流量
if(u==des)
return minx;
int tmp;
for(int v=1;v<=m;v++)
if(map[u][v]>0 && dep[v]==dep[u]+1 && (tmp=DFS(v,min(minx,map[u][v])))){
map[u][v]-=tmp; //正向減少
map[v][u]+=tmp; //反向增加
return tmp;
}
return 0;
}
int Dinic(){
int ans=0,tmp;
while(BFS()){
while(1){
tmp=DFS(1,INF);
if(tmp==0)
break;
ans+=tmp;
}
}
return ans;
}
int main(){
//freopen("input.txt","r",stdin);
while(~scanf("%d%d",&n,&m)){
memset(map,0,sizeof(map));
int u,v,w;
for(int i=0;i<n;i++){
scanf("%d%d%d",&u,&v,&w);
map[u][v]+=w; //防止有重邊
}
src=1, des=m;
printf("%d\n",Dinic());
}
return 0;
}