图算法总结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];
上面的时间复杂度为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:关键路径 O(n+e)

提到关键路径,首先来区分两个概念:AOV(Activity On Vertex Network)网和AOE(Activity On Edge)网。
与AOE有关的研究问题
1)完成整个工程至少需要多少时间?
2)哪些活动是影响工程进度(费用)的关键?
大体思路是先求出事件的最早发生时间(ve(i))和最晚发生时间(vl(i)),然后求出活动的最早发生时间(e(i))和最晚发生时间(l(i)),
对某活动,若e(i) == l(i),则此活动为关键活动,最后,由关键活动组成的路径为关键路径,而关键路径上的事件为关键事件。

最后,附送一道关于图的附加题
CloneGraph(https://oj.leetcode.com/problems/clone-graph/)


0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 我的头发长得慢怎么办 衣服混洗染色了怎么办 黑裤子洗成红色怎么办 衣服烘干后皱了怎么办 毛衣洗了变长了怎么办 boy烫金被洗掉了怎么办 黑衣服洗得发白怎么办 黑衣服洗后发白怎么办 黑裤子洗了发白怎么办 黑衣服旧了发白怎么办 黑色衣服洗白了怎么办 黑衣服洗了泛白怎么办 刚买的衣服掉色怎么办 棉质的衣服褪色怎么办 黑裤子晒掉色了怎么办 新买的衣服褪色怎么办 衣服洗了掉毛怎么办 衣服受潮长了斑点怎么办 黑色的衣服粘毛怎么办 黑衣服容易粘毛怎么办 衣服上粘了毛毛怎么办 黑衣服防止粘毛怎么办 洗黑色衣服掉毛怎么办 兔毛的衣服掉毛怎么办 带绒的衣服掉毛怎么办 黑裤子被84掉色怎么办 买的衣服掉毛怎么办 裤子穿久了泛亮怎么办 新买的裤子褪色怎么办 黑裤子掉毛严重怎么办 黑裤子洗完发白怎么办 新买羊绒衫掉毛怎么办 皮草毛卷起来了怎么办 小孩衣服洗不干净怎么办 衣服沾上钢笔水怎么办 羊绒衫洗了掉毛怎么办 白衬衫弄上墨水怎么办 羊毛衬衫洗错了怎么办 婚纱照拍的太丑怎么办 微信加人没反应怎么办 新买的毛毯有味怎么办