python之Dijkstra最短路徑

我沒用python包,直接頭鐵寫下來了,因爲初學python,還沒了解python包,網上找了很多,有用了networkx包的,有用函數的等,有很多解法,因爲臨近期末要複習考試課,老師佈置了這個東西,就沒那麼多時間整了,就直接寫了。

關於算法的思路在代碼中註釋的有。

直接上代碼:

e = [[0 for l in range(10)] for i in range(10)]
dis = [0 for j in range(10)]
book = [0 for k in range(10)]
r = int(input("請輸入開始節點:"))
n = int(input("請輸入節點個數:"))
m = int(input("請輸入權值的個數:"))
inf = 99999999      # 定義一個比較大的數來表示正無窮,即表示節點與節點之間沒有權值
o = 0
p = 0
while o < n:
    p = 0
    while p < n:
        if o == p:
            e[o][p] = 0     # 節點到節點本身權值設爲0
        else:
            e[o][p] = inf   # 其餘全部設置爲正無窮
        p += 1
    o += 1
o = 0
while o < m:
    e1, e2, s1 = map(int, input(f'輸入第{o + 1}組節點及他們之間的權值:').split())     # 輸入兩個節點,以及他們之間的權值
    e[e1-1][e2-1] = s1      # 因爲是從零開始的,所以輸入的節點都要-1
    o += 1
p = 0
while p < n:
    dis[p] = e[r-1][p]      # 創建一個dis一維數組來存放開始節點到其他頂點的路徑
    p += 1
book[r-1] = 1               # 創建一個book一維數組來標記已經確定的最短路徑,1表示已經標記過
o = 0                       # 這裏開始節點到開始節點的距離0爲已經確定過的最短距離,所以標記爲1
p = 0
v = 0
u = 0
while o < n-1:
    min1 = inf
    p = 0
    v = 0
    while p < n:
        if book[p] == 0 and dis[p] < min1:      # 在dis數組中找到book爲0的最小值
            min1 = dis[p]
            u = p
        p += 1
    book[u] = 1                                 # 找到之後確定爲最短距離,用book標記爲1
    while v < n:
        if e[u][v] < inf:
            if dis[v] > dis[u] + e[u][v]:       # 比較直線距離和通過其他節點中轉的距離,選出最小的
                dis[v] = dis[u] + e[u][v]
        v += 1
    o += 1
o = 0
while o < n:
    if dis[o] == inf:
        print(f'開始節點{r}到{o+1}之間沒有路徑')       # 輸出開始節點到各個節點的距離,距離爲inf的話說明沒有路徑
    else:
        print(f'開始節點{r}到{o+1}的最短距離是{dis[o]}')
    o += 1

初學python,感覺這次作業練習了前面學習的基礎語法。

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