[图论]最大流介绍 Ford-Fulkerson算法 邻接表实现
来源:互联网 发布:java 垃圾评论过滤 编辑:程序博客网 时间:2024/05/29 09:37
这次来讲最大流的相关问题,介绍图上的网络流。网络流具有各种各样的性质和应用,还有很多的变体,程序设计竞赛当中也经常会出现相关题目。
先来看一个例子:
最大传输量
网络中有两台计算机
把计算机当作顶点,把链接计算机的通信电缆当作边,就可以把这个网络当作一个有向图来考虑了。图中的每条边
- 记录每条边对应的实际数据传输量为
f(e) - 传输量应该满足如下限制:
0≤f(e)≤c(e) - 对任意
v∈{s,t} 都有Σe∈ξ−(v)f(e)=Σe∈ξ+(v)f(e) ,即数据在传输过程中既不会增加也不会减少,收到的量和发出去的量必须相等。 - 目标是最大化从
s 发出的数据量Σe∈ξ+(s)f(e)
我们称是的传输量最大的f为最大流,而求解最大流的问题称为最大流问题。此外, 我们称c 为边的容量,f 为边的流量,s 为源点,t 为汇点。那么,这个问题应该如何求解呢?首先考虑下面的贪心算法。
1、找一条s 到t 的只经过f(e)<c(e) 的边的路径。
2、如果不存在满足条件的路径,则结束算法,否则,沿着该路径尽可能地增加c(e) ,返回第一步。
将该算法运用于样例,就得到了如下结果:
这样的结果是正确的吗?事实上,如果采用以下的方案,可以得到更优的结果。显然这个贪心算法是不正确的。
我们观察两者之间的流量之差,可以发现,后者的方案在1->2之间少了1Mbps,却换来了s->2和1->3->5两处的流量增加。事实上,就是将原先得到的流给退回去,从而得到了新的更大的流,将算法进行如下改进:
1、只利用满足
2、如果不存在满足条件的路径,则结束,否则,沿着该路径尽可能地增加流,返回第一步。
struct edge{int to,cap,rev;};//终点、容量、反向边vector<edge> G[MAXV];//邻接表bool used[MAXV]; //dfs时要用到//向图中增加一条从s到t,容量为cap的边void add_edge(int from,int to,int cap){ edge temp; temp.to = to; temp.cap = cap; temp.rev = G[to].size(); G[from].push_back(temp); temp.to = from; temp.cap = 0, temp.rev = G[from].size()-1; G[to].push_back(temp);}int dfs(int v,int t,int f){ if (v==t) return f; used[v] = true; for(int i = 0; i < G[v].size(); i++) { edge &e = G[v][i]; if (!used[e.to] && e.cap > 0) { int d = dfs(e.to, t, min(f,e.cap)); if (d>0) { e.cap -= d; G[e.to][e.rev].cap += d; return d; } } } return 0;}int max_flow(int s,int t){ int flow = 0; for(;;) { memset(used,0,sizeof(used)); int f = dfs(s,t,INF); if (f==0) return flow; flow += f; }}
记最大流的流量为F,那么Ford-Fulkerson算法最多进行F次深度优先搜索,所以其复杂度为O(F|E|)。不过,这是一个很松的上界,达到这种最坏复杂度的情况几乎不存在。所以在多数情况下,即便通过估算得到的复杂度偏高,实际运用当中还是比较快的。
0 0
- [图论]最大流介绍 Ford-Fulkerson算法 邻接表实现
- 最大流 Ford-Fulkerson算法
- 最大流算法--Ford-Fulkerson方法及其多种实现
- 最大流问题-Ford-Fulkerson算法 C++极简实现
- Ford-Fulkerson算法求最大流Java实现
- HDU1532 最大流 Ford-Fulkerson(邻接矩阵/邻接表) Dinic(邻接矩阵/邻接表)
- hdu 3549最大流Ford-Fulkerson算法
- 最大流之Ford-Fulkerson算法
- 最大流问题(Ford-Fulkerson算法)
- 最大流 Ford-Fulkerson算法模板
- 最大流算法之Ford-Fulkerson
- Ford-Fulkerson算法模板(最大流)
- 最大网络流的Ford-Fulkerson 算法
- 最大流问题Ford-Fulkerson算法
- 最大流算法(Ford-Fulkerson)
- 最大流之Ford-Fulkerson算法
- 求解最大流的 Ford-Fulkerson 算法
- Ford-Fulkerson(最大流)
- 360在线笔试题:求数列的和
- 欢迎使用CSDN-markdown编辑器
- android ratingbar自定义图片
- I学霸官方免费教程十七:Java面向对象之接口
- UVa 10129 Play on Words 欧拉通路
- [图论]最大流介绍 Ford-Fulkerson算法 邻接表实现
- 简单好记又完整的的配置环境变量
- getAttribute和getParameter区别
- 杭电 1513 Palindrome LCS DP
- (1)why我要学习PHP内核源码
- HDU5365Run(计算几何)详解
- Android studio两个便利的方法
- atitit. 分销系统规划p8k
- X-code插件资源下载