📜  Dijkstra的算法

📅  最后修改于: 2020-12-10 06:59:32             🧑  作者: Mango

Dijkstra的算法

它是一种贪心算法,可以解决有向图G =(V,E)且边沿权重为非负的有向图的单源最短路径问题,即每个边(u,v)∈E的w(u,v)≥0 。

Dijkstra的算法维护一组顶点S,这些顶点的最终最短路径权重已确定。对于所有顶点v∈S;我们有d [v] =δ(s,v)。该算法反复选择具有最小最短路径估计的顶点u∈V-S,将u插入S并放宽所有留下u的边。

因为它总是选择V-S中“最轻”或“最接近”的顶点插入到集合S中,所以称为贪婪策略

分析: Dijkstra算法在具有边E和顶点V的图形上的运行时间可以表示为| E |的函数。和| V |使用Big-O表示法。 Dijkstra算法的最简单实现是将集合Q的顶点存储在普通链表或数组中,而操作Extract-Min(Q)只是对Q中所有顶点的线性搜索。在这种情况下,运行时间为O(| V 2 | + | E | = O(V 2 )。

例:

解:

步骤1: Q = [s,t,x,y,z]

我们一一扫描顶点,然后找出相邻的顶点。计算每个相邻顶点之间的距离。

我们制作一个堆栈,其中包含在计算出最短距离之后选择的那些顶点。

首先,我们在堆栈M中取“”(这是来源)

  M = [S]       Q = [t, x, y, z]

步骤2:现在找到与t和y相邻的s。

Adj [s] → t, y      [Here s is u and t and y are v]

案例-(i) s→t
d [v]> d [u] + w [u,v]
d [t]> d [s] + w [s,t]
∞> 0 + 10 [错误条件]
然后d [t]←10
π[t]←5
调整[s]←t,y

情况-(ii) s→y
d [v]> d [u] + w [u,v]
d [y]> d [s] + w [s,y]
∞> 0 + 5 [假条件]
∞> 5
然后d [y]←5
π[y]←5

通过比较情况(i)和情况(ii)
调整[s]→t = 10,y = 5
y最短
y以5 = [s,y]分配

步骤3:现在找到y的相邻点,即t,x,z。

Adj [y] → t, x, z   [Here y is u and t, x, z are v]

案例-(i) y→t
d [v]> d [u] + w [u,v]
d [t]> d [y] + w [y,t]
10> 5 + 3
10> 8
然后d [t]←8
π[t]←y

案例-(ii) y→x
d [v]> d [u] + w [u,v]
d [x]> d [y] + w [y,x]
∞> 5 + 9
∞> 14
然后d [x]←14
π[x]←14

案例-(iii) y→z
d [v]> d [u] + w [u,v]
d [z]> d [y] + w [y,z]
∞> 5 + 2
∞> 7
然后d [z]←7
π[z]←y

通过比较情况(i),情况(ii)和情况(iii)
调整[y]→x = 14,t = 8,z = 7
z最短
在7 = [s,z]中分配了z

步骤-4现在,我们将找到s,x的调整[z]

Adj [z] → [x, s]       [Here z is u and s and x are v]

案例-(i) z→x
d [v]> d [u] + w [u,v]
d [x]> d [z] + w [z,x]
14> 7 + 6
14> 13
然后d [x]←13
π[x]←z

案例-(ii) z→s
d [v]> d [u] + w [u,v]
d [s]> d [z] + w [z,s]
0> 7 + 7
0> 14
∴此条件不满足,将被丢弃。
现在我们有x = 13。

步骤5:现在我们将找到Adj [t]

调整[t]→[x,y] [这里t是u,x和y是v]

案例-(i) t→x
d [v]> d [u] + w [u,v]
d [x]> d [t] + w [t,x]
13> 8 + 1
13> 9
然后d [x]←9
π[x]←t

案例-(ii) t→y
d [v]> d [u] + w [u,v]
d [y]> d [t] + w [t,y]
5> 10
∴此条件不满足,将被丢弃。

因此我们得到所有最短路径顶点为

从s到y的权重为5
从s到z的权重为7
从s到t的权重为8
从s到x的权重是9< p="">

在给定的图中,这是到光源的最短距离。

Dijkstra算法的缺点:

  • 它会进行盲目搜索,因此在处理时会浪费大量时间。
  • 它不能处理负边缘。
  • 它导致无环图,并且通常无法获得正确的最短路径。
  • 我们需要跟踪已访问的顶点。

从s到z的权重为7
从s到t的权重为8
从s到x的权重是9<>