1532
网络流,EK算法,模板题。输出最大流。
#include<bits/stdc++.h>
using namespace std;
int n,m,s,t;
int mep[205][205];
int pre[205],vis[205];
bool bfs(){
int cur;
queue<int>Q;
memset(pre,0,sizeof(pre));
memset(vis,0,sizeof(vis));
vis[s]=1;
Q.push(s);
while(!Q.empty()){
cur=Q.front();
Q.pop();
if(cur==t)return 1;//搜到结尾了,表示找到一条增广路
for(int i=1;i<=n;i++){
if(!vis[i]&&mep[cur][i]){
Q.push(i);
pre[i]=cur;
vis[i]=1;
}
}
}
return 0;//没有搜到完整的
}
int maxflow(){
int ans=0;
while(1){
if(!bfs()){
return ans;//找不到新的增广路了,此时已经是最大流
}
int minimum=0x3f3f3f3f;
for(int i=t;i!=s;i=pre[i])
minimum=min(minimum,mep[pre[i]][i]);//这条增广路上的最小流量
for(int i=t;i!=s;i=pre[i]){
mep[pre[i]][i]-=minimum;//都减去最小流量
mep[i][pre[i]]+=minimum;//反向边,退流回溯
}
ans+=minimum;
}
}
int main(){
int a,b,c;
while(scanf("%d%d",&m,&n)!=EOF){//m条关系,n个点
memset(mep,0,sizeof(mep));
s=1;t=n;
while(m--){
scanf("%d%d%d",&a,&b,&c);
mep[a][b]+=c;
}
printf("%d\n",maxflow());
}
return 0;
}