迪杰斯特拉算法-单源最短路径

采用广度优先搜索思想,对有向赋权图寻找最短路径。 
该算法对于不含负权的有向图来说,是目前已知的最快的单源最短路径算法。 
时间复杂度:O(n^2) 
基本原理:不断为为每个顶点 v 保留目前为止所找到的从s到v的最短路径 

 

from cmath import inf
"""
每次找到离源点最近的一个点,以该点为中心进行扩展,最终得到源点到其余所有点的最短路径

1.将所有定点分为两部分:已知最短路径的定点集合P和未知最短路径的定点集合Q,初始时,已知最短路径的
定点只有源点一个定点。用BOOK列表,表示哪些点在P中

2.源点到自己的最短路径为0,已知的路径dis[i] 设置成map_list[0][i],不可达的,设置为Inf

3.在未知最短路径的顶点集合中选择一个离源点最近的定点(即dis[u]最小),加入到集合P,并考察所有
以点u为起点的边,对每一条边进行松弛操作,如果存在一条边使得dis[u]+e[u][v]比dis[v]小,
则用新值替代当前的dis[v]中的值

4.重复第三步,如果集合Q为空,算法结束,dis是源点到每个定点的最短路径
"""
map_list =[
    [0,1,12,inf,inf,inf],
    [inf,0,9,3,inf,inf],
    [inf,inf,0,inf,5,inf],
    [inf,inf,4,0,13,15],
    [inf,inf,inf,inf,0,4],
    [inf,inf,inf,inf,inf,0],
]
dis = [0,1,12,inf,inf,inf]
#标记已经确定的点
known_list = []
for i in range(6): #最后一个点不需要
    min = inf
    #每次遍历,找出一个已知到源点最近的顶点
    for j in range(6):
        if j not in known_list and dis[j]<min:
            #第一次循环,是0点
            min = dis[j]
            #记录该点,对该点进行松弛
            u = j
    #该点是已知到源点最近的点
    known_list.append(u)
    #对u点进行松弛
    for y in range(6):
        #如果找到一点使得 dis[y]>dis[u]+map_list[u][y] 即 0-y > 0-u-y,进行一次松弛
        if dis[y] > dis[u]+map_list[u][y]:
            dis[y] = dis[u]+map_list[u][y]




猜你喜欢

转载自blog.csdn.net/wang785994599/article/details/81479479