前言:
迪杰斯特拉算法是求解从一点出发到其他点的所有的最短路径的算法。简单来说:若一个图有(
,
,
,
,
,
)6个顶点,那么求解的是从
点出发,分别到
,
,
,
,
点的最短路径。
问题:
下图,从顶点
到其他各个顶点的最短路径。
(S+T=V)集合V是全集,集合T是我们需要的。T的范围是从空集到全集V,S的范围是从V全集到空集。
刚开始S={
,
,
,
,
,
},T={},V={
,
,
,
,
,
}
求解:
首先,我们定义一个数组Dis,数组长度和顶点个数一样,6个点,数组长度就是6,数据里面存到这个点的距离,所以第一个值肯定是0,表示自己到自己的距离为0。
- 第1次:从
出发,能到哪里的就把距离写下来,到不了的就写正无穷(最小值加入集合)
说明:只能走一步,从
出发,
到
距离为
,因为到不了,
到
距离为10,其他依次类推。因此,我们发现,
到
的距离最短,因为你不可能做到(通过其他节点到
,而且距离还比10更小)。所以T集合={
,
} ,且记下路线最短路径(
---->
)。S集合={
,
,
,
}
注:T集合用绿色标记,更新的距离用红色标记
- 第2次:从
出发,确定经过由上一个结点中转的路线。(也就是说,这个时候可以通过
-->
-->其他点)
说明:从第一步我们已经知道,可以借助
这个点达到其他点。因为
能到
,而且距离是50,所以我们发现,如果从
出发,通过
到达
,距离就可以变成10+50=60。10表示从
到
的距离,50表示
到
的距离。很不巧,
只能到
,所以我们只能更新数组中
的值,从
变成了60,也就是上述数组中的红色数字60。但是并不是说,
到
的最短路径就是60,我们只是更新了一下距离而已,更新完距离就要更新T集合。T集合会加入S集合中,最短的那个点。S集合= {
,
,
,
},很显然
加入了T。此时T集合={
,
,
},且记下路线(
---->
)。S集合={
,
,
}
- 第3次:找到S集合中最小的值,(加入T集合)+(更新S集合的值)
说明:T集合={
,
,
},S集合={
,
,
}。所以现在需要更新{
,
,
}的距离,经过计算,不管通过{
,
,
}哪个点到
,都是不可达到,所以Dis[1]=
,从{
-->
--->
}的距离为50,50比60小,所以可以更新Dis[3]的距离。同理,{
-->
--->
}的距离为90,比100小,更新Dis[5]的值。S集合中有资格加入T集合的是
。此时T集合={
,
,
,
},且记下路线(
---->
---->
)。S集合={
,
}
- 第4次:找到S集合中最小的值,(加入T集合)+(更新S集合的值)
说明:根据上述步骤,发现不管通过T集合中哪个点到
,都无法达到,则Dis[1]=
,通过(
---->
---->
---->
)可以发现距离为60,60小于原来的值90,所以需要更新距离。S集合={
,
},有资格加入T集合的点
。此时T集合={
,
,
,
,
},且记下路线(
---->
---->
---->
)。S集合={
}
- 第5次:找到S集合中最小的值,(加入T集合)+(更新S集合的值)
说明:不管通过T集合中哪个点到
,都无法达到,则Dis[1]=
。此时T集合={
,
,
,
,
,
},S集合=空集。圆满结束。
总结:
|
起点 |
终点 |
最短路径 |
长度 |
|
v1 |
V3 |
{v1,v3} |
10 |
|
|
V5 |
{v1,v5} |
30 |
|
|
V4 |
{v1,v5,v4} |
50 |
|
|
V6 |
{v1,v5,v4,v6} |
60 |
|
|
v2 |
无 |
∞ |