图算法总结2(最短路径、最大流、关键路径)[没完成]
来源:互联网 发布:陈有西 公知律师 编辑:程序博客网 时间:2024/06/05 22:46
前言:图的算法面试考的不多,主要是基本慨念和思想,题目也基本是在基本算法有所变化,所以,个人觉得把基本算法熟练掌握即可。
1:最短路径(前三个基于贪心算法,最后一个基于DP)
看过算法导论的童鞋都晓得,最短路径最重要的一个函数就是Relax()了,这是基于贪心算法的最短路径算法的基础。
见上面的示意图,设原点为s,每个vertex的值为每个vertex距离原点s的当前最短距离,在图(a)中,此时u已经求得了当前最短距离,
而对v进行Relax,没Relax之前,s到v的距离为d[v]==9,,s到u的距离d[u]==5,du[u]+w(u,v) == 7 < d[v],这说明v到s的路径不是最短路径,
根据贪心算法,我们取当前最优方案,将s~v的路径设为s~u->v,并将d[v] = 7。同样见图(b),此时由于d[u]+w(u,v) ==7 > d[v] ==6,
so不需要更新从s到v的路径。伪代码如下图:
另外每个算法都出现的一个函数是
1.1:The Bellman-Ford algorithm O(VE)
这个算法是最基础的算法,边的权值可正可负,如果有负权边则输出错误提示
1.2:Shortest Path Faster Algorithm O(E)
这个算法百度百科里有(http://baike.baidu.com/view/4700690.htm?from_id=11018124&type=syn&fromtitle=SPFA&fr=aladdin)
使用条件:当给定的图存在负权边,Dijkstr不适用,而Bellman-Ford复杂度过高。
负环检测:如果某个点进入队列的次数超过了n次,则可以断定存在负权边。
1.3:Single-sourceshortest paths in DAG O(V+E)
这个算法仅适用于有向无环图,可以用拓扑排序来检测
这个算法还可以用来求关键路径(最长路径):将权值取反(不必担心负权环),然后就最短路径即可。
1.4:Dijkstra’sAlgorithm O(V3)
1.5:Floyd-Warshall Algorithm(DP)
思想:设顶点编号(0,1,2…n-1),DP[i][j][k]为i到j,经过结点的编号至多为k(0 ≤ k ≤ n-1)的最短路径。
则当知DP[i][j][k] 时求DP[i][j][k+1],有两种情况(选择较小值):
1)DP[i][j][k+1]所表征的路径经过结点k+1,此时DP[i][j][k+1] = DP[i][k+1][k] + DP[k+1][j][k];
2)DP[i][j][k+1]所表征的路径不经过结点k+1,此时DP[i][j][k+1] = DP[i][j][k];
1)DP[i][j][k+1]所表征的路径经过结点k+1,此时DP[i][j][k+1] = DP[i][k+1][k] + DP[k+1][j][k];
2)DP[i][j][k+1]所表征的路径不经过结点k+1,此时DP[i][j][k+1] = DP[i][j][k];
上面的时间复杂度为O(n^3),空间复杂度也为O(n^3),在实现的时候,我们可以将空间复杂度减为O(n^2)。
1.6:最短路径例题
1):给你n个点,m条无向边,每条边都有长度d和花费p,给你起点s终点t,要求输出起点到终点的
最短距离及其花费,如果最短距离有多条路线,则输出花费最少的。(九度-1008-最短路径问题)
答:这道题还是求最短路径,只不过增加了一个附加条件最小花费,我们可以在relax的时候,如果出现多条想等到当前最短路径,
则选择那条最小花费的路径来。大家可能对这边还是不太了解,我们用一个示意图来讲一下。
如下图所示,设某一节点v的前序节点为u1,u2,,,,uk.现在对节点v进行relax即:Relax(u1,v,w1), Relax(u2,v,w2)....Relax(uk,v,wk),
在relax的时候,可能会出现d[ui]+wi == d[uj]+wj < d[v],这个时候就需要看 cost[ui]+c(ui,v) 和cost[uj]+c(uj,v)哪个小了。
不知讲清楚没。。
2):有n个长为m+1的字符串,如果某个字符串的最后m个字符与某个字符串的前m个字符匹配,则两个字符串可以联接,
问这n个字符串最多可以连成一个多长的字符串,如果出现循环,则返回错误。
答:这道题很容易转化为图的最长路径问题,转化为图后,先进行拓扑排序,检查是否存在环,若存在,则返回错误,否则,
求每个节点之间的最大路径(权值取反即可转化为最小路径问题)。
3):hdu 2544:最短路径
2:最大流
关于最大流问题,本人只了解了最大流的概念及求解方法。
最大流有两个特性,第一个是容量限制,第二个是流守恒性。
如果有多个起始点和多个终点,可按下图的方式来转换成单个起始点和单个终点问题。
想要明白怎么求最大流,先要讲解三个概念。
1)概念一:残留网络(Residual Networks),对某一流,用下面的公式来求得相应的图即为残留网络。
2)概念二:增广路径(Augmenting Paths),在残留网络中,从起始点s到终点t的一条路径即为增广路径,我们可以用DFS或BFS来求。
3)概念三:流网络的割(Cuts of flow networks),所谓流网络的割,即将流网络的节点分为两个集合S和T,
例如对于下面的图,c(S,T) = c(v1,v3) + c(v2,v4) = 12+14 = 26.
最大流最小割定理(Max-flow min-cut Theorem)
根据最大流最小割定理,我们可以得到Ford-Fulkerson方法。其中求增广路径,只要存在,随便一条就可以。
最大流例题
1)在保证流量最大的前提下,所需的费用最小,这就是最小费用最大流问题(费用为流量的单位费用)
答:只需每次求增广路径时,将单位费用作为边的权值,求最短路径即可。
2)UVa 10330- Power Transmission
http://www.cnblogs.com/fzf123/p/3194365.html
3)Poj1273-Drainage Ditches
http://snprintf.net/archives/291
4)BZOJ 1001-狼抓兔子
http://www.cnblogs.com/zhj5chengfeng/p/3273531.html
5)poj2516-经典最小费用最大流
http://blog.csdn.net/weixinding/article/details/7218870
3)Poj1273-Drainage Ditches
http://snprintf.net/archives/291
4)BZOJ 1001-狼抓兔子
http://www.cnblogs.com/zhj5chengfeng/p/3273531.html
5)poj2516-经典最小费用最大流
http://blog.csdn.net/weixinding/article/details/7218870
3:关键路径 O(n+e)
提到关键路径,首先来区分两个概念:AOV(Activity On Vertex Network)网和AOE(Activity On Edge)网。
与AOE有关的研究问题
1)完成整个工程至少需要多少时间?
2)哪些活动是影响工程进度(费用)的关键?
1)完成整个工程至少需要多少时间?
2)哪些活动是影响工程进度(费用)的关键?
大体思路是先求出事件的最早发生时间(ve(i))和最晚发生时间(vl(i)),然后求出活动的最早发生时间(e(i))和最晚发生时间(l(i)),
对某活动,若e(i) == l(i),则此活动为关键活动,最后,由关键活动组成的路径为关键路径,而关键路径上的事件为关键事件。
最后,附送一道关于图的附加题
CloneGraph(https://oj.leetcode.com/problems/clone-graph/)
0 0
- 图算法总结2(最短路径、最大流、关键路径)[没完成]
- 最短路径算法总结
- 最大流的算法(EK算法)—>Edmonds-Karp算法(最短路径增广算法)
- 最短路径最大流的SAP算法
- 最短路径--算法2
- 图的拓扑排序、关键路径、最短路径算法 -- C++实现
- 关键路径与最短路径解析
- 最大流算法之EK(最短路径增广算法)
- 最短路径常用算法总结
- 最短路径算法复杂度总结
- 最短路径算法复杂度总结
- 最短路径算法
- 最短路径算法
- 最短路径算法
- 最短路径算法
- 最短路径算法
- 最短路径算法
- 最短路径算法
- xmpp和OpenFire实例,实现即时聊天室,支持离线消息
- 开发需要记住的几件事情
- EGORefreshTableHeaderView--ARC下面的使用
- 程序员生存定律--细论影响人生成绩的四个要素(2)
- 2014-06-15工作周报-耿田义
- 图算法总结2(最短路径、最大流、关键路径)[没完成]
- uva 401 Palindromes(字符串回文处理)
- Haskell学习——语法
- Ajax的post提交数据
- YUI事件:自定义事件,以及这几天对javascript编程的认识
- 个人学习记录_软件结构(1)
- linux下单独编译安装Apache rewrite_module
- Eclipse中配置Tomcat
- 适配器模式