Python實(shí)現(xiàn)Dijkstra算法
Dijkstra算法
迪杰斯特拉算法是由荷蘭計(jì)算機(jī)科學(xué)家狄克斯特拉于1959 年提出的,因此又叫狄克斯特拉算法。是從一個頂點(diǎn)到其余各頂點(diǎn)的最短路徑算法,解決的是有向圖中最短路徑問題。迪杰斯特拉算法主要特點(diǎn)是以起始點(diǎn)為中心向外層層擴(kuò)展,直到擴(kuò)展到終點(diǎn)為止。
迪杰斯特拉算法是求從某一個起點(diǎn)到其余所有結(jié)點(diǎn)的最短路徑,是一對多的映射關(guān)系,是一種貪婪算法
示例:

算法
算法實(shí)現(xiàn)流程思路:
迪杰斯特拉算法每次只找離起點(diǎn)最近的一個結(jié)點(diǎn),并將之并入已經(jīng)訪問過結(jié)點(diǎn)的集合(以防重復(fù)訪問,陷入死循環(huán)),然后將剛找到的最短路徑的結(jié)點(diǎn)作為中間結(jié)點(diǎn)來更新相鄰結(jié)點(diǎn)的路徑長度,這樣循環(huán)找到圖中一個個結(jié)點(diǎn)的最短路徑。
"""
輸入
graph 輸入的圖
src 原點(diǎn)
返回
dis 記錄源點(diǎn)到其他點(diǎn)的最短距離
path 路徑
"""
import json
def dijkstra(graph,src):
if graph ==None:
return None
# 定點(diǎn)集合
nodes = [i for i in range(len(graph))] # 獲取頂點(diǎn)列表,用鄰接矩陣存儲圖
# 頂點(diǎn)是否被訪問
visited = []
visited.append(src)
# 初始化dis
dis = {src:0}# 源點(diǎn)到自身的距離為0
for i in nodes:
dis[i] = graph[src][i]
path={src:{src:[]}} # 記錄源節(jié)點(diǎn)到每個節(jié)點(diǎn)的路徑
k=pre=src
while nodes:
temp_k = k
mid_distance=float('inf') # 設(shè)置中間距離無窮大
for v in visited:
for d in nodes:
if graph[src][v] != float('inf') and graph[v][d] != float('inf'):# 有邊
new_distance = graph[src][v]+graph[v][d]
if new_distance <= mid_distance:
mid_distance=new_distance
graph[src][d]=new_distance # 進(jìn)行距離更新
k=d
pre=v
if k!=src and temp_k==k:
break
dis[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(nodes)
return dis,path
if __name__ == '__main__':
# 輸入的有向圖,有邊存儲的就是邊的權(quán)值,無邊就是float('inf'),頂點(diǎn)到自身就是0
graph = [
[0, float('inf'), 10, float('inf'), 30, 100],
[float('inf'), 0, 5, float('inf'), float('inf'), float('inf')],
[float('inf'), float('inf'), 0, 50, float('inf'), float('inf')],
[float('inf'), float('inf'), float('inf'), 0, float('inf'), 10],
[float('inf'), float('inf'), float('inf'), 20, 0, 60],
[float('inf'), float('inf'), float('inf'), float('inf'), float('inf'), 0]]
dis,path= dijkstra(graph, 0) # 查找從源點(diǎn)0開始帶其他節(jié)點(diǎn)的最短路徑
print(dis)
print(json.dumps(path, indent=4))
總結(jié)
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,謝謝大家對腳本之家的支持。如果你想了解更多相關(guān)內(nèi)容請查看下面相關(guān)鏈接
- Python數(shù)據(jù)結(jié)構(gòu)與算法之圖的最短路徑(Dijkstra算法)完整實(shí)例
- Python使用Dijkstra算法實(shí)現(xiàn)求解圖中最短路徑距離問題詳解
- python實(shí)現(xiàn)dijkstra最短路由算法
- python實(shí)現(xiàn)Dijkstra靜態(tài)尋路算法
- python實(shí)現(xiàn)Dijkstra算法的最短路徑問題
- python Dijkstra算法實(shí)現(xiàn)最短路徑問題的方法
- python3實(shí)現(xiàn)Dijkstra算法最短路徑的實(shí)現(xiàn)
- 一文教你用python編寫Dijkstra算法進(jìn)行機(jī)器人路徑規(guī)劃
- python最短路徑的求解Dijkstra算法示例代碼
相關(guān)文章
Python根據(jù)URL地址下載文件并保存至對應(yīng)目錄的實(shí)現(xiàn)
這篇文章主要介紹了Python根據(jù)URL地址下載文件并保存至對應(yīng)目錄的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-11-11
Python模擬登錄requests.Session應(yīng)用詳解
這篇文章主要介紹了Python模擬登錄requests.Session應(yīng)用詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-11-11
python密碼學(xué)換位密碼及換位解密轉(zhuǎn)置加密教程
這篇文章主要為大家介紹了python密碼學(xué)換位密碼及換位解密轉(zhuǎn)置加密教程,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-05-05
Python?eval()和exec()函數(shù)使用詳解
exec函數(shù)執(zhí)行的是python語句,沒有返回值,eval函數(shù)執(zhí)行的是python表達(dá)式,有返回值,exec函數(shù)和eval函數(shù)都可以傳入命名空間作為參數(shù),本文給大家介紹下Python?eval()和exec()函數(shù),感興趣的朋友跟隨小編一起看看吧2022-11-11
python自定義模塊使用.pth文件實(shí)現(xiàn)重用方式
這篇文章主要介紹了python自定義模塊使用.pth文件實(shí)現(xiàn)重用方式,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-02-02

