之前的讨论了无权图的最短路径算法。数据结构与算法——无权最短路径算法的C++实现
如果是加权图,那么问题就变得困难了,不过仍然可以采用无权情况的想法。
我们仍然保留之前的信息。因此,每个顶点会被标记为known或unknown,每个顶点保留一个尝试性的距离dv(这个距离是只使用一些known顶点作为中间顶点从s到v的最短路径的长),每个顶点还保留字段pv,该字段是记录引起dv变化的最后的顶点。
图顶点信息的数据结构:
//保存每个顶点信息的数据结构
struct GraphNode{
bool known;//当前顶点距离起点的距离是否确定
int dist;//当前顶点到起点的最短距离
int path;//当前顶点距离起点的最短路径的前一个顶点
};
Dijkstra算法简介:
解决单源最短路径问题的一般方法叫做Dijkstra算法。这个算法是贪心算法最好的例子。
贪心算法一般分阶段求解问题,在每个阶段它都把出现的东西当作是最好的去处理。
与无权最短路径算法一样,Dijkstra算法按阶段进行。在每个阶段,Dijkstra算法选择一个顶点v,它在所有的unknown顶点中具有最小的dv,同时算法声明从s到v的最短路径是known的。其它阶段由顶点dv的更新工作成。
主要思想就是根据已经确定了的点的距离,来确定该点相邻顶点的距离,不断的向外散射,直到所以的点的到起点的最短距离确定为止。
下面是Dijkstra算法具体步骤图示:
假设源点s=v1,下面是求s到其它点的最短距离。
第一步:初始化顶点信息
第二步:
顶点v1就是顶点s,那么距离顶点v1路径长为0,将顶点v1字段的known设为true。
与s相邻的点为v2,v4。v1到v2的距离为4,v1到v4的距离为1。并更新v2和v4的距离。
p2 = v1; p4 = v1;
第三步:
寻找unknown的顶点中距离最短的顶点,并将该顶点标记为known。所以将v4标记为known。
然后,再根据顶点v4的dv值更新与v4相邻的所有点(v3,v6,v7,v5)的距离。
d4+d43 = 1+2 < d3,所以d3 = 3;p3 = v4;

本文详细介绍了解决加权图单源最短路径问题的Dijkstra算法,包括算法的主要思想、步骤和伪代码,并提供了完整的C++实现示例。

2万+

被折叠的 条评论
为什么被折叠?



