python矩陣/字典實(shí)現(xiàn)最短路徑算法
前言:好像感覺(jué)各種博客的最短路徑python實(shí)現(xiàn)都花里胡哨的?輸出不明顯,唉,可能是因?yàn)椴幌胱x別人的代碼吧(明明自己學(xué)過(guò)離散)。然后可能有些人是用字典實(shí)現(xiàn)的?的確字典的話,比較省空間。改天,也用字典試下。先貼個(gè)圖吧。

然后再貼代碼:
_=inf=999999#inf
def Dijkstra_all_minpath(start,matrix):
length=len(matrix)#該圖的節(jié)點(diǎn)數(shù)
path_array=[]
temp_array=[]
path_array.extend(matrix[start])#深復(fù)制
temp_array.extend(matrix[start])#深復(fù)制
temp_array[start] = inf#臨時(shí)數(shù)組會(huì)把處理過(guò)的節(jié)點(diǎn)的值變成inf,表示不是最小權(quán)值的節(jié)點(diǎn)了
already_traversal=[start]#start已處理
path_parent=[start]*length#用于畫(huà)路徑,記錄此路徑中該節(jié)點(diǎn)的父節(jié)點(diǎn)
while(len(already_traversal)<length):
i= temp_array.index(min(temp_array))#找最小權(quán)值的節(jié)點(diǎn)的坐標(biāo)
temp_array[i]=inf
path=[]#用于畫(huà)路徑
path.append(str(i))
k=i
while(path_parent[k]!=start):#找該節(jié)點(diǎn)的父節(jié)點(diǎn)添加到path,直到父節(jié)點(diǎn)是start
path.append(str(path_parent[k]))
k=path_parent[k]
path.append(str(start))
path.reverse()#path反序產(chǎn)生路徑
print(str(i)+':','->'.join(path))#打印路徑
already_traversal.append(i)#該索引已經(jīng)處理了
for j in range(length):#這個(gè)不用多說(shuō)了吧
if j not in already_traversal:
if (path_array[i]+matrix[i][j])<path_array[j]:
path_array[j] = temp_array[j] =path_array[i]+matrix[i][j]
path_parent[j]=i#說(shuō)明父節(jié)點(diǎn)是i
return path_array
#領(lǐng)接矩陣
adjacency_matrix=[[0,10,_,30,100],
[10,0,50,_,_],
[_,50,0,20,10],
[30,_,20,0,60],
[100,_,10,60,0]
]
print(Dijkstra_all_minpath(4,adjacency_matrix))
然后輸出:
2: 4->2
3: 4->2->3
0: 4->2->3->0
1: 4->2->1
[60, 60, 10, 30, 0]
主要是這樣輸出的話比較好看,然后這樣算是直接算一個(gè)點(diǎn)到所有點(diǎn)的最短路徑吧。那么寫下字典實(shí)現(xiàn)吧
def Dijkstra_all_minpath_for_graph(start,graph):
inf = 999999 # inf
length=len(graph)
path_graph={k:inf for k in graph.keys()}
already_traversal=set()
path_graph[start]=0
min_node=start#初始化最小權(quán)值點(diǎn)
already_traversal.add(min_node)#把找到的最小節(jié)點(diǎn)添加進(jìn)去
path_parent={k:start for k in graph.keys()}
while(len(already_traversal)<=length):
p = min_node
if p!=start:
path = []
path.append(str(p))
while (path_parent[p] != start):#找該節(jié)點(diǎn)的父節(jié)點(diǎn)添加到path,直到父節(jié)點(diǎn)是start
path.append(str(path_parent[p]))
p=path_parent[p]
path.append(str(start))
path.reverse()#反序
print(str(min_node) + ':', '->'.join(path))#打印
if(len(already_traversal)==length):break
for k in path_graph.keys():#更新距離
if k not in already_traversal:
if k in graph[min_node].keys() and (path_graph[min_node]+graph[min_node][k])<path_graph[k]:
path_graph[k]=path_graph[min_node]+graph[min_node][k]
path_parent[k]=min_node
min_value=inf
for k in path_graph.keys():#找最小節(jié)點(diǎn)
if k not in already_traversal:
if path_graph[k]<min_value:
min_node=k
min_value=path_graph[k]
already_traversal.add(min_node)#把找到最小節(jié)點(diǎn)添加進(jìn)去
return path_graph
adjacency_graph={0:{1:10,3:30,4:100},
1:{0:10,2:50},
2:{1:50,3:20,4:10},
3:{0:30,2:20,4:60},
4:{0:100,2:10,3:60}}
print(Dijkstra_all_minpath_for_graph(4,adjacency_graph))
輸出:
2: 4->2
3: 4->2->3
0: 4->2->3->0
1: 4->2->1
{0: 60, 1: 60, 2: 10, 3: 30, 4: 0}
還行吧,有時(shí)間再看看networkx這個(gè)庫(kù)怎么說(shuō)。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Python+PyQt5來(lái)實(shí)現(xiàn)文件高速查找
這篇文章主要為大家詳細(xì)介紹了如何模擬Everything,即通過(guò)python+PyQt5來(lái)實(shí)現(xiàn)可視化文件的高速查找,文中的示例代碼講解詳細(xì),需要的可以參考一下2023-07-07
代碼詳解django中數(shù)據(jù)庫(kù)設(shè)置
在本篇文章里小編給大家分享了關(guān)于django中數(shù)據(jù)庫(kù)設(shè)置的相關(guān)實(shí)例內(nèi)容,有興趣的朋友們跟著學(xué)習(xí)下。2019-01-01
python網(wǎng)絡(luò)編程示例(客戶端與服務(wù)端)
這篇文章主要介紹了python網(wǎng)絡(luò)編程示例,提供了客戶端與服務(wù)端,需要的朋友可以參考下2014-04-04
你知道怎么改進(jìn)Python 二分法和牛頓迭代法求算術(shù)平方根嗎
這篇文章主要介紹了Python編程實(shí)現(xiàn)二分法和牛頓迭代法求平方根代碼的改進(jìn),具有一定參考價(jià)值,需要的朋友可以了解下,希望能夠給你帶來(lái)幫助2021-08-08
Python報(bào)錯(cuò)TypeError: ‘dict‘ object is not&
在Python開(kāi)發(fā)的旅程中,報(bào)錯(cuò)信息就像是一個(gè)個(gè)路障,阻礙著我們前進(jìn)的步伐,而“TypeError: ‘dict’ object is not iterable”這個(gè)報(bào)錯(cuò),常常讓開(kāi)發(fā)者們陷入困惑,那么,這個(gè)報(bào)錯(cuò)究竟是怎么產(chǎn)生的呢?又該如何有效地解決它呢?讓我們一起深入探討,找到解決問(wèn)題的方法2024-10-10

