Dijkstra算法
1.算法特征
Dijkstra(迪克斯特拉)算法是一种经典的广度优先的状态空间搜索算法,即算法会从初始点开始一层一层地搜索整个自由空间直到到达目标点。
从一个节点遍历其余各节点,解决有权图的最短路径问题。
2.算法思路
Dijkstra算法声明一个数组dis[m]来保存源点到各个顶点的最短距离,声明一个集合S保存已经找到了最短路径的顶点,声明一个集合U存放未确定最短路径的顶点。
- 初始时,集合S只有起点o。起点o的路径权重被赋为0(dis[o,o]=0)。若对于起点o存在能直接到达的边(o,m),则把dis[o,m]设为V(o,m);同时把所有o不能直接到达的顶点对应路径长度设为无穷大。
- 寻找集合S当前顶点x与集合U中所有顶点的最短路径,对应的顶点记为y,dis[o,y]即为y到o的最短距离,更新起点o到z(z是y的所有相点)最短距离dis[o,z]=min(dis[o,z],dis[o,y]+dis[y,z])
- 更新集合S当前顶点x=y,集合U删去顶点y
- 重复2,3步,直至集合U为空
3.举例
起点A —— 终点D
二维数组储存两点间的权值
class solution:
def Dijkstra(self,nums):
#nums=['A','B','C','D','E','F','G']
inf=float('inf')
Value=[[inf,12,inf,inf,inf,16,14],[12,inf,10,inf,inf,7,inf],[inf,10,inf,3,5,6,inf],
[inf,inf,3,inf,4,inf,inf],[inf,inf,5,4,inf,2,8],[16,7,6,inf,2,inf,9],[14,inf,inf,inf,8,9,inf]]
s=[0]
u=[i for i in range(1,len(nums))]
Dis=[0]+Value[0][1:]
while u:
i=s[-1]
#寻找与原点最近的且未遍历的顶点np
minP,np=Dis[u[0]],u[0]
for j in u:
if Dis[j]<minP:
np=j
minP=Dis[j]
s.append(np)
#更新np相邻结点到原点的最短路径长度
for k in range(n):
if k not in s and Value[np][k]!=inf:
Dis[k]=min(Dis[k],minP+Value[np][k])
u.remove(np)