算法:Python實現dijkstra最短路由

Dijkstra算法:又稱迪傑斯特拉算法,迪傑斯特拉算法是由荷蘭計算機科學家狄克斯特拉於1959 年提出的,因此又叫狄克斯特拉算法。是從一個頂點到其餘各頂點的最短路徑算法,解決的是有向圖中最短路徑問題。迪傑斯特拉算法主要特點是以起始點爲中心向外層層擴展,直到擴展到終點爲止百度百科

注意:Dijkstra算法不能處理包含負邊的圖

# dijkstra算法實現,有向圖和路由的源點作爲函數的輸入,最短路徑最爲輸出
def dijkstra(graph,src):
    # 判斷圖是否爲空,如果爲空直接退出
    if graph is None:
        return None
    nodes = [i for i in range(len(graph))]  # 獲取圖中所有節點
    visited=[]  # 表示已經路由到最短路徑的節點集合
    if src in nodes:
        visited.append(src)
        nodes.remove(src)
    else:
        return None
    distance={src:0}  # 記錄源節點到各個節點的距離
    for i in nodes:
        distance[i]=graph[src][i]  # 初始化
    # print(distance)
    path={src:{src:[]}}  # 記錄源節點到每個節點的路徑
    k=pre=src
    while nodes:
        mid_distance=float('inf')
        for v in visited:
            for d in nodes:
                new_distance = graph[src][v]+graph[v][d]
                if new_distance < mid_distance:
                    mid_distance=new_distance
                    graph[src][d]=new_distance  # 進行距離更新
                    k=d
                    pre=v
        distance[k]=mid_distance  # 最短路徑
        path[src][k]=[i for i in path[src][pre]]
        path[src][k].append(k)
        # 更新兩個節點集合
        visited.append(k)
        nodes.remove(k)
        print(visited,nodes)  # 輸出節點的添加過程
    return distance,path
if __name__ == '__main__':
    graph_list = [ [0, 2, 1, 4, 5, 1],
            [1, 0, 4, 2, 3, 4],
            [2, 1, 0, 1, 2, 4],
            [3, 5, 2, 0, 3, 3],
            [2, 4, 3, 4, 0, 1],
            [3, 4, 7, 3, 1, 0]]

    distance,path= dijkstra(graph_list, 0)  # 查找從源點0開始帶其他節點的最短路徑
    print(distance,path)

節點的遍歷過程如下:
這裏寫圖片描述
最短路徑輸出:
這裏寫圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章