线性规划网络流之最短增广路算法
代码实现
#include<iostream>
#include<queue>
#include<cstring>
using namespace std;
const int MAXNODESIZE=100;
const int INF=(1<<30)-1;
int residualNetwork[MAXNODESIZE][MAXNODESIZE];
int realFlowNetwork[MAXNODESIZE][MAXNODESIZE];
int preArray[MAXNODESIZE];
bool looked[MAXNODESIZE];
int nodeSize,edgeSize;
bool bfs(int snode,int enode);
int EK(int snode,int enode);
void print();
int main(void){
int u,v,w;
memset(residualNetwork,0,sizeof(residualNetwork));
memset(realFlowNetwork,0,sizeof(realFlowNetwork));
cout<<"请输入结点个数n与边的数量m: \n";
cin>>nodeSize>>edgeSize;
cout<<"请输入两个结点u,v以及u--v的最大容量cap:\n";
for(int i=1;i<=edgeSize;i++){
cin>>u>>v>>w;
residualNetwork[u][v]+=w;
}
cout<<"网络的最大流值为: "<<EK(1,nodeSize)<<endl;
print();
return 0;
}
bool bfs(int snode,int enode){
memset(preArray,-1,sizeof(preArray));
memset(looked,false,sizeof(looked));
queue<int>Queue;
looked[snode]=true;
Queue.push(snode);
while(!Queue.empty()){
int now=Queue.front();
Queue.pop();
for(int i=1;i<=nodeSize;i++){
if(!looked[i]&&residualNetwork[now][i]>0){
looked[i]=true;
preArray[i]=now;
if(i==enode){
return true;
}
Queue.push(i);
}
}
}
return false;
}
int EK(int snode,int enode){
int v,w,d,maxflow;
maxflow=0;
while(bfs(snode,enode)){
v=enode;
d=INF;
while(v!=snode){
w=preArray[v];
if(d>residualNetwork[w][v]){
d=residualNetwork[w][v];
}
v=w;
}
maxflow+=d;
v=enode;
while(v!=snode){
w=preArray[v];
residualNetwork[w][v]-=d;
residualNetwork[v][w]+=d;
if(realFlowNetwork[v][w]>0){
realFlowNetwork[v][w]-=d;
}else{
realFlowNetwork[w][v]+=d;
}
v=w;
}
}
return maxflow;
}
void print(){
cout<<"实流网络:\n";
for(int i=1;i<=nodeSize;i++){
cout<<" v"<<i;
}
cout<<"\n";
for(int i=1;i<=nodeSize;i++){
cout<<"v"<<i;
for(int j=1;j<=nodeSize;j++){
cout<<" "<<realFlowNetwork[i][j];
}
cout<<"\n";
}
}
测试样例
请输入结点个数n与边的数量m:
6 9
请输入两个结点u,v以及u--v的最大容量cap:
1 2 12
1 3 10
2 4 8
3 2 2
3 5 13
4 3 5
4 6 18
5 4 6
5 6 4
网络的最大流值为: 18
实流网络:
v1 v2 v3 v4 v5 v6
v1 0 8 10 0 0 0
v2 0 0 0 8 0 0
v3 0 0 0 0 10 0
v4 0 0 0 0 0 14
v5 0 0 0 6 0 4
v6 0 0 0 0 0 0