博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
最大流算法
阅读量:6820 次
发布时间:2019-06-26

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

基本的知识,解决什么问题这些东西就不说啦。算法导论和很多大神博客都讲解的很详细。

它其实就是不停的找增广路直到找不到为止。此时通过的所有流量就是最大流量。

我推荐一篇文章:(基本过程讲解的很详细,我很收益。)

下面是我的实现。

参考了

 

#include
#include
using namespace std;#define MAX 1024int nodes,edges;int capacity[MAX][MAX];//记录边的当前还可以通过的最大流量int maxflow=0;bool isVisited[MAX];//在BFS或DFS找增广路的时候记录该元素是否访问过int pre[MAX];//记录节点的前一个节点/* 我最疑惑的地方是capacity[i][pre[i]]+=increase;这个地方。 我们一开始以为这只是一个简单的有向图,其实不是,这个有向图会根据它的两个节点之间的通过的流量自动改变 我们可以把它看成是最原始的有向图中有箭头的两个节点可以相互通过流,而不仅仅是沿箭头的方向通过流(通过判断两个节点之间的最大 流量来判断。) 表达能力实在有限。。我自己都觉得没说清楚..*/inline int min(int a,int b){ return a>b?b:a;}bool DFS(int src){ if(!src) pre[src]=-1; if(src==nodes-1) return true; isVisited[src]=true; for(int i=0;i
myQueue; myQueue.push(0); isVisited[0]=true; pre[0]=-1; while(!myQueue.empty()) { int current=myQueue.front(); myQueue.pop(); for(int i=0;i
=0;i=pre[i]) { increase=min(increase,capacity[pre[i]][i]); } for(i=nodes-1;pre[i]>=0;i=pre[i]) { capacity[pre[i]][i]-=increase; capacity[i][pre[i]]+=increase; } maxflow+=increase; }}void main(){ while(1) { cin>>nodes>>edges; int firstnode,secondenode,capa; for(int i=0;i
>firstnode>>secondenode>>capa; capacity[firstnode][secondenode]=capa; } MaxFlow(); cout<
<

这里提供两种找增广路的算法:DFS和BFS。

 

 

你可能感兴趣的文章
大数据开发第一步:Hadoop基础学习
查看>>
eclipse的jvm配置
查看>>
python的常用模块
查看>>
我的友情链接
查看>>
Delphi下WebBrowser应用示例
查看>>
AS3的http
查看>>
启动模式、时钟浅见
查看>>
ORA-01033: ORACLE initialization or shutdown in progress ,Enterprise Manager Console
查看>>
Intellij IDEA 一些不为人知的技巧
查看>>
演示:如何编译tbox
查看>>
简单的安卓应用授权认证(JNI)
查看>>
查看硬盘读取速率
查看>>
把匹配的小写转换成大写(\U、\u)
查看>>
【算法】最短路径之A*搜索
查看>>
【Android网络开发の5】Android中的网络数据下载
查看>>
linux终端使用python的matplotlib模块画图出现“could not open display”问题解决
查看>>
9月国内浏览器市场份额大战:IE份额上升至48.45%
查看>>
Tapestry 教程(五)实现Hi-Lo猜谜游戏
查看>>
2015年12月国内网民地域分布12强:湖北跻身上榜
查看>>
mysql-5.6安装
查看>>