#include<iostream>
#include<queue>
using namespace std;
#define INF 1<<30
#define M 201
#define Min(a,b) (a)<(b)?(a):(b)
int cap[M][M],flow[M][M],n,m; //cap 最大流量,flow 残流量
void Input(){
memset(cap,0,sizeof(cap));
for(int i=0;i<n;i++){
int from,to,flowNum;
cin>>from>>to>>flowNum;
cap[from][to]+=flowNum; //此处+= 要小心。
}
}
void Ek(int s,int t){
memset(flow,0,sizeof(flow));
int maxflow=0,path[M],minflow[M];
while(true){ //寻最大流最小残量
queue<int> q;
q.push(s);
minflow[s]=INF;
memset(path,0,sizeof(path));//父节点全部表示为0
path[s]=-1;//源节点表示为-1,特殊。
while(!q.empty()){
int temp=q.front();q.pop();
for(int i=1;i<=m;i++){
if(!path[i] && cap[temp][i]>flow[temp][i]){ //判断条件为此点无父节点,且残量小于最大容量
q.push(i);
path[i]=temp;
minflow[i]=Min(minflow[temp],cap[temp][i]-flow[temp][i]);
}
}
if(path[t]){
int pre=t;
while(path[pre]>0){ //增广路减去最小残量
flow[path[pre]][pre]+=minflow[t];
flow[pre][path[pre]]-=minflow[t];
pre=path[pre];
}
break;
}
}
if(path[t])
maxflow+=minflow[t];
else{
cout<<maxflow<<endl;
return ;
}
}
}
int main(){
while(cin>>n>>m){
Input();
Ek(1,m);
}
}
Hdu 1532 网络流模版
最新推荐文章于 2021-09-13 15:07:51 发布