当前位置 博文首页 > wang785994599的博客:迪杰斯特拉算法-单源最短路径

    wang785994599的博客:迪杰斯特拉算法-单源最短路径

    作者:[db:作者] 时间:2021-09-06 18:57

    采用广度优先搜索思想,对有向赋权图寻找最短路径。?
    该算法对于不含负权的有向图来说,是目前已知的最快的单源最短路径算法。?
    时间复杂度: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]
    
    
    
    
    

    ?

    cs