我沒用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,感覺這次作業練習了前面學習的基礎語法。