news 2026/9/6 17:43:08

EdmondsKarp算法求最大流

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
EdmondsKarp算法求最大流

EdmondsKarp算法是Ford-Fulkerson算法的特例,区别在于Ford-Fulkerson算法没有给出残存网络中增广路径的寻找方法,而EdmondsKarp算法使用广度优先搜索寻找增广路径
找到增广路径后沿其递增或递减流,得到更大的流,重复下去直到残存网络不存在增广路径为止
具体见算法导论(第三版):26.2节
算法实现如下(C++)

#include<iostream>#include<vector>#include<deque>usingnamespacestd;#include"graph.h"constintN=6;size_t s=0;size_t t=5;vector<vector<int>>flow_function(N,vector<int>(N,0));//流函数vector<vector<int>>capacity{{0,16,13,0,0,0},{0,0,0,12,0,0},{0,4,0,0,14,0},{0,0,9,0,0,20},{0,0,0,7,0,4},{0,0,0,0,0,0}};//流网络每一条边的容量intmain(){GraphCf(N);//残存网络vector<pair<size_t,size_t>>input{{0,1},{0,2},{1,3},{2,1},{2,4},{3,2},{3,5},{4,3},{4,5}};vector<vector<bool>>adj_matrix(N,vector<bool>(N,false));//流网络的邻接矩阵vector<vector<int>>capacity_f(N,vector<int>(N,0));//残存网络中每条边的容量c(u,v)for(constauto&run:input){adj_matrix[run.first][run.second]=true;}for(size_t i=0;i<N;++i){for(size_t j=0;j<N;++j){if(adj_matrix[i][j]){capacity_f[i][j]=capacity[i][j];if(capacity_f[i][j]!=0){Cf.insertEdge(i,j);}}}}while(true)//广度优先搜索寻找残存网络中的由源点至汇点的增广路径{boolhas_find_path=false;vector<bool>visited(N,false);vector<longlong>pre(N,-1);deque<size_t>work_queue;work_queue.push_back(s);visited[s]=true;while(work_queue.empty()==false){size_t cur=work_queue.front();work_queue.pop_front();for(EdgeNode*run=Cf.getFirstEdge(cur);run!=nullptr;run=Cf.nextEdge(run)){if(visited[run->vertex_id]==false){pre[run->vertex_id]=cur;visited[run->vertex_id]=true;if(run->vertex_id==t){has_find_path=true;break;}work_queue.push_back(run->vertex_id);}}if(has_find_path){break;}}if(has_find_path==false){break;}intCp=-1;size_t run=t;while(pre[run]!=-1){if(Cp==-1||Cp>capacity_f[pre[run]][run]){Cp=capacity_f[pre[run]][run];}run=pre[run];}run=t;while(pre[run]!=-1)//沿增广路径递增流{if(adj_matrix[pre[run]][run]){if(flow_function[pre[run]][run]==0){Cf.insertEdge(run,pre[run]);}flow_function[pre[run]][run]+=Cp;capacity_f[pre[run]][run]-=Cp;if(capacity_f[pre[run]][run]==0){Cf.deleteEdge(pre[run],run);}}else{if(flow_function[run][pre[run]]==capacity[run][pre[run]]){flow_function[run][pre[run]]-=Cp;Cf.insertEdge(run,pre[run]);capacity_f[run][pre[run]]=Cp;}else{flow_function[run][pre[run]]-=Cp;capacity_f[run][pre[run]]+=Cp;}if(flow_function[run][pre[run]]==0){Cf.deleteEdge(pre[run],run);capacity_f[pre[run]][run]=0;}else{capacity_f[pre[run]][run]=flow_function[run][pre[run]];}}run=pre[run];}}cout<<"最大流为"<<endl;for(size_t i=0;i<N;++i)//输出最大流{for(size_t j=0;j<N;j++){if(flow_function[i][j]!=0){cout<<i<<"-"<<j<<":"<<flow_function[i][j]<<endl;}}}return0;}
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/6 17:34:18

trivy开源安全漏洞扫描器——筑梦之路

开源地址&#xff1a;https://github.com/aquasecurity/trivy.git 可扫描的对象 容器镜像文件系统Git存储库&#xff08;远程&#xff09;虚拟机镜像Kubernetes 在容器镜像安全方面使用广泛&#xff0c;其他使用相对较少。 能够发现的问题 正在使用的操作系统包和软件依赖项…

作者头像 李华
网站建设 2026/9/6 17:33:01

连锁餐饮SAP ERP实战:财务业务一体化与供应链协同落地指南

简介&#xff1a;一份面向连锁餐饮企业管理者、SAP实施顾问及零售信息化决策者的SAP ERP财务业务一体化解决方案文档&#xff0c;聚焦Hollys Coffee从6家门店向两年100家门店扩张中的管理痛点&#xff0c;内容覆盖财务集中核算、门店管理、采购与供应链协同、库存控制、客户与加…

作者头像 李华
网站建设 2026/9/6 17:32:50

随机振动试验全解析:IEC 60068-2-64-2019标准实操指南

简介&#xff1a;国际电工委员会IEC 60068-2-64-2019标准是一份针对产品环境振动试验的正式技术规范&#xff0c;面向电子设备研发、可靠性测试与质量管控人员&#xff0c;用于解决产品在运输、存储及实际使用中因振动导致的结构损坏、功能失效等问题&#xff0c;为开展振动环境…

作者头像 李华
网站建设 2026/9/6 17:32:00

Ghostwriter 项目安装与配置指南

Ghostwriter 项目安装与配置指南 【免费下载链接】ghostwriter Text editor for Markdown 项目地址: https://gitcode.com/gh_mirrors/gh/ghostwriter 1. 项目基础介绍 Ghostwriter 是一个在 Windows 和 Linux 系统上运行的开源 Markdown 文本编辑器。Markdown 是一种轻…

作者头像 李华