传送门:点击打开链接
#include <iostream>
#include <queue>
#include <cstring>
#include <cstdio>
using namespace std;
const int N = 210;
const int INF = 0x7FFFFFFF;
int n,m,map[N][N],path[N],flow[N],start,end;///path数组表示前一个端点
queue<int> q;
int bfs(){
int i,t;
while(!q.empty()) q.pop();
memset(path,-1,sizeof(path));
path[start]=0,flow[start]=INF; ///起始容量为inf,源点无限流量
q.push(start);
while(!q.empty()){
t=q.front();
q.pop();
if(t==end) break; ///剪枝
for(i=1;i<=m;i++){
if(i!=start && path[i]==-1 && map[t][i]){
flow[i]=flow[t]<map[t][i]?flow[t]:map[t][i];
q.push(i);
path[i]=t;
}
}
}
if(path[end]==-1) return -1;
return flow[m]; ///一次遍历之后的流量增量
}
int Edmonds_Karp(){
int max_flow=0,step,now,pre;
while((step=bfs())!=-1){ ///找不到增路径时退出
max_flow+=step;
now=end;
while(now!=start){
pre=path[now];
map[pre][now]-=step; ///更新正向边的实际容量
map[now][pre]+=step; ///添加反向边
now=pre;
}
}
return max_flow;
}
int main(){
int i,u,v,cost;
while(scanf("%d %d",&n,&m)!=EOF){
memset(map,0,sizeof(map));
for(i=0;i<n;i++){
scanf("%d %d %d",&u,&v,&cost);
map[u][v]+=cost; ///为防止一条边不止一次输入
}
start=1,end=m;
printf("%d\n",Edmonds_Karp());
}
return 0;
}