博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
线性规划网络流之最短增广路算法
阅读量:3967 次
发布时间:2019-05-24

本文共 3002 字,大约阅读时间需要 10 分钟。

线性规划网络流之最短增广路算法

代码实现

/*最短增广路C++实现参考资料:《趣学算法》陈小玉 人民邮电出版社*/#include
#include
#include
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);//bfs找可增广路int EK(int snode,int enode);//找最短增广路具体算法:对实流网络以及残余网络的操作void print();//输出实流网络int main(void){
int u,v,w; //残余网络初始化为0 memset(residualNetwork,0,sizeof(residualNetwork)); //实流网络初始化为0 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<<"网络的最大流值为: "<
<
Queue; //源点设为已访问 looked[snode]=true; //源点入队列 Queue.push(snode); while(!Queue.empty()){
//如果队列不为空则bfs int now=Queue.front(); Queue.pop(); for(int i=1;i<=nodeSize;i++){
//寻找可增广路 if(!looked[i]&&residualNetwork[now][i]>0){
//now-->i:i没有访问过,且残余网络now-->i还可以增广 looked[i]=true;//结点i设为已访问 preArray[i]=now;//记录结点i的前驱结点 if(i==enode){
//到达汇点,找到一条可增广路 return true; } Queue.push(i);//结点i入队列 } } } return false;//找不到可增广路}//找最短增广路具体算法:对实流网络以及残余网络的操作int EK(int snode,int enode){
int v,w,d,maxflow;//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){
//正常来说是w--->v增广,如果[v][w]>0则代表实际流向为w<---v,增广量为w--->v的增加 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"<

测试样例

请输入结点个数n与边的数量m:6 9请输入两个结点u,v以及u--v的最大容量cap:1 2 121 3 102 4 83 2 23 5 134 3 54 6 185 4 65 6 4网络的最大流值为: 18实流网络:       v1       v2       v3       v4       v5       v6v1      0      8      10      0      0      0v2      0      0      0      8      0      0v3      0      0      0      0      10      0v4      0      0      0      0      0      14v5      0      0      0      6      0      4v6      0      0      0      0      0      0

转载地址:http://aucki.baihongyu.com/

你可能感兴趣的文章
主函数main中变量(int&nbsp;argc…
查看>>
主函数main中变量(int&nbsp;argc…
查看>>
转载--request_irq()&nbsp;|&nbsp;注册…
查看>>
转载--request_irq()&nbsp;|&nbsp;注册…
查看>>
深入分析request_irq的dev_i…
查看>>
深入分析request_irq的dev_i…
查看>>
wait_event_interruptible()
查看>>
wait_event_interruptible()
查看>>
linux中断底层硬件操作方法…
查看>>
linux中断底层硬件操作方法…
查看>>
系统处理&nbsp;IRQ_EINT0&nbsp;IRQ_EIN…
查看>>
系统处理&nbsp;IRQ_EINT0&nbsp;IRQ_EIN…
查看>>
misc_register和register_ch…
查看>>
misc_register和register_ch…
查看>>
misc_register和register_ch…
查看>>
misc_register和register_ch…
查看>>
platform设备添加流程(转载)
查看>>
platform设备添加流程(转载)
查看>>
GCC编译关键字“__attribute_…
查看>>
GCC编译关键字“__attribute_…
查看>>