编程语言
首页 > 编程语言> > 狄克斯特拉算法

狄克斯特拉算法

作者:互联网

狄克斯特拉算法用于每条边都有关联数字的图,这些数字称为权重(weight)。

带权重的图称为加权图(weighted graph),不带权重的图称为非加权图(unweighted graph)。

要计算非加权图中的最短路径,可使用广度优先搜索。要计算加权图中的最短路径,可使用狄克斯特拉算法。

无向图意味着两个节点彼此指向对方,其实就是环!

在无向图中,每条边都是一个环。狄克斯特拉算法只适用于有向无环图(directed acyclic graph,DAG)。

例子:计算从起点到终点的用时最少的路径,以及时间

(1) 找出“最便宜”的节点,即可在最短时间内到达的节点。
(2) 更新该节点的邻居的开销
(3) 重复这个过程,直到对图中的每个节点都这样做了。
(4) 计算最终路径。

 

节点的开销指的是从起点出发前往该节点需要多长时间。你知道的,从起

点到节点B需要2分钟,从起点到节点A需要6分钟(但你可能会找到所需时间更
短的路径)。你不知道到终点需要多长时间。对于还不知道的开销,你将其设
置为无穷大。在Python中能够表示无穷大吗?你可以这样做:infinity = float("inf")

第一步:

找出最便宜的节点。你站在起点,不知道该前往节点A还是前往节点B。前往这两
个节点都要多长时间呢?前往节点A需要6分钟,而前往节点B需要2分钟。至于前往

其他节点,你还不知道需要多长时间。由于你还不知道前往终点需要多长时间,

因此你假设为无穷大(这样做的原因你马上就会明白)。节点B是最近的——2分钟就能达到。

第二步:计算经节点B前往其各个邻居所需的时间。

对于节点B的邻居,如果找到前往它的更短路径,就更新其开销。在这里,你找到了:
 前往节点A的更短路径(时间从6分钟缩短到5分钟);
 前往终点的更短路径(时间从无穷大缩短到7分钟)。

第三步:重复!
重复第一步:找出可在最短时间内前往的节点。你对节点B执行了第二步,除节点B外,可
在最短时间内前往的节点是节点A。

重复第二步:更新节点A的所有邻居的开销。

你发现前往终点的时间为6分钟!

你对每个节点都运行了狄克斯特拉算法(无需对终点这样做)。现在,你知道:

 前往节点B需要2分钟;

 前往节点A需要5分钟;

 前往终点需要6分钟。

 

需要:

创建开销表

一个存储父节点的散列表

一个数组,记录处理过的节点,对于同一个节点,你不用处理多次

 

计算S城到M城的最短路径,边的权重表示分钟

 

 

标签:终点,前往,路径,分钟,算法,斯特拉,节点,狄克
来源: https://www.cnblogs.com/pickKnow/p/10960654.html