您的位置:首页 > 其它

图之Dijkstra算法、Floyd算法(最小路径问题)

2015-07-05 18:24 246 查看

本文内容部分来源于网易云课堂浙江大学数据结构视频教程和华山大师兄的博客http://www.cnblogs.com/biyeymyhjob/archive/2012/07/31/2615833.html,谢谢!!!



最小路径问题

在网络(带权重的图)中,求两个不同顶点之间的所有路径中,边的权重之和最小的那一条路径——最短路径,第一个顶点为源点,最后一个顶点为终点。
单源最短路径问题:从固定源点出发,求其到所有其他顶点的最短路径。(有向)无权图、(有向)有权图
多源最短路径问题:求任意两点间的最短路径

1.1无权图的单源最短路算法

按照递增的顺序找出到各个顶点的最短路。





dist[w]可以初始化为无穷大或-1.输入S为源点,源点压入队Q

1.3有权图的单源最短路算法



按照递增的顺序找出到各个顶点的最短路:Dijkstra算法:



算法步骤:

a.初始时,S只包含源点,即S={v},v的距离为0。U包含除v外的其他顶点,即:U={其余顶点},若v与U中顶点u有边,则<u,v>正常有权值,若u不是v的出边邻接点,则<u,v>权值为∞。

b.从U中选取一个距离v最小的顶点k,把k,加入S中(该选定的距离就是v到k的最短路径长度)。

c.以k为新考虑的中间点,修改U中各顶点的距离;若从源点v到顶点u的距离(经过顶点k)比原来距离(不经过顶点k)短,则修改顶点u的距离值,修改后的距离值的顶点k的距离加上边上的权。

d.重复步骤b和c直到所有顶点都包含在S中。



例子:



寻找从点A出发,到其他所有点的最短路径
步骤:从点A出发,此时S={A},未收录点U={B,C,D,E,F},找和顶点A相连且权重最小的边,(A,C),将C点收录进来,则S={A,C},U={C,D,E,F},A到C最短路径3;
接下来以刚收录的C为中间点,找和顶点C相连且权重最小的边(C,B),此时A到C到B权重为5,退回刚收录的C点时A到B权重为6,大于5,所以A到B的最短路径为A到B,5,此时S={A,C,B},U={D,E,F};
接下来以刚收录的B为中间点,找和顶点B相连且权重最小的边(B,D),此时A到B到D权重为11,退回刚收录的B点时A到C到D权重为6,小于11,所以A到D的最短路径为A到C到D,6,此时S={A,C,B,D},U={E,F};
接下来以刚收录的D为中间点,找和顶点D相连且权重最小的边(D,E),此时A到C到D到E的权重为8,退回刚收录的B点时A到C到E权重为7,小于8,所以A到E的最短路径为A到C到E到,7,此时S={A,C,B,D,E},U={F};
接下来以刚收录的E为中间点,找和顶点F相连且权重最小的边(E,F),此时A到C到E到F权重为12,退回刚收录的E点,发现C点和F点不直接相连,那我们就找和F点直接相连的D点,A到C到D到F权重为9,小于12,所以A到F的最短路径为A到C到D到F,12,此时S={A,C,B,D,E,F}。



1.3多源最短路算法

方法1:直接将单源最短路算法调用|V|遍;
方法2:Floyd算法



基本思想如下:从任意节点A到任意节点B的最短路径不外乎2种可能,1是直接从A到B,2是从A经过若干个节点X到B。所以,我们假设Dis(AB)为节点A到节点B的最短路径的距离,对于每一个节点X,我们检查Dis(AX)
+ Dis(XB) < Dis(AB)是否成立,如果成立,证明从A到X再到B的路径比A直接到B的路径短,我们便设置Dis(AB) = Dis(AX) + Dis(XB),这样一来,当我们遍历完所有节点X,Dis(AB)中记录的便是A到B的最短路径的距离。

算法描述:

a.从任意一条单边路径开始。所有两点之间的距离是边的权,如果两点之间没有边相连,则权为无穷大。   

b.对于每一对顶点 u 和 v,看看是否存在一个顶点 w 使得从 u 到 w 再到 v 比己知的路径更短。如果是更新它。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: