博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
网络流之增广路算法
阅读量:4358 次
发布时间:2019-06-07

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

这部分内容在《算法竞赛入门经典》——刘汝佳 里面讲的已经很详细了。但里面对于反向流量的作用是没有说明的。这里只说一下反向流量的作用。

推荐上看下。

 

反向流量能够让后面的流自我调整。

例如当前状态下

当前状态下如何寻找?

用a表示残量, cap表示容量,很明显,3-4这条路不是最优的.

此时BFS, 会得到 a[2] = 2, a[4] = 2, a[3] = 1 (提示:cap[4][3]-flow[4][3]=1), a[5]=1, a[6]=1, a[7]=1

更新流量得到

可以看到,通过方向流量,使得网络流自我调整到最优。

 

 附上代码:

#include 
#include
#include
#include
using namespace std;const int maxn = 20;const int INF = (1<<30);int cap[maxn][maxn], flow[maxn][maxn];int n;int EdmondsKarp(int s, int t) { int p[maxn], a[maxn]; queue
q; memset(flow, 0, sizeof(flow)); int f = 0; while(true) { memset(a, 0, sizeof(a)); a[s] = INF; q.push(s); while(!q.empty()) { //BFS 找增广路 int u = q.front(); q.pop(); for(int v=1; v<=n; v++) if(!a[v] && cap[u][v]>flow[u][v]){ //找到新节点v p[v] = u; q.push(v); a[v] = min(a[u], cap[u][v]-flow[u][v]); } } if(a[t] == 0) break; //找不到,则当前流已经是最大流 for(int u=t; u != s; u = p[u]) { //从汇点往回走 flow[p[u]][u] += a[t]; //更新正向流量 flow[u][p[u]] -= a[t]; //更新反向流量 } f += a[t]; //更新从 s 流出的流量 } return f;}

 

 

 

转载于:https://www.cnblogs.com/tanhehe/p/3234248.html

你可能感兴趣的文章
基于jquery地图特效全国网点查看代码
查看>>
【leetcode】867 - Transpose Matrix
查看>>
(转)Intellij Idea工具栏添加打开选中文件的资源管理器位置
查看>>
Linux 的面试小题 9
查看>>
45.排序
查看>>
JQuery学习笔记(3)JQuery中的DOM操作
查看>>
PHP关于时间的方法
查看>>
dom4j 解析 xml标签属性
查看>>
C语言中命名空间的实现
查看>>
七. 多线程编程2.Java线程模型
查看>>
八. 输入输出(IO)操作2.面向字符的输入流
查看>>
HTML5 — Wed Storage简单示例
查看>>
T-SQL单双引号---分隔符相关
查看>>
关于SVN 目录结构,使用教程
查看>>
关于linux下配置python3的virtualenvwrapper
查看>>
Oracle中如何用SQL检测字段是否包括中文字符
查看>>
POJ1258Agri-Net
查看>>
浅谈SPFA(队列优化的Bellman-Ford算法)
查看>>
python从文件读取数据
查看>>
c++11 中的注意事项
查看>>