演算法 Python實現dijkstra最短路由

2021-07-25 16:06:42 字數 1495 閱讀 9762

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

# dijkstra演算法實現,有向圖和路由的源點作為函式的輸入,最短路徑最為輸出

defdijkstra

(graph,src):

# 判斷圖是否為空,如果為空直接退出

if graph is

none:

return

none

nodes = [i for i in range(len(graph))] # 獲取圖中所有節點

visited= # 表示已經路由到最短路徑的節點集合

if src in nodes:

nodes.remove(src)

else:

return

none

distance= # 記錄源節點到各個節點的距離

for i in nodes:

distance[i]=graph[src][i] # 初始化

# print(distance)

path=} # 記錄源節點到每個節點的路徑

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=dpre=v

distance[k]=mid_distance # 最短路徑

path[src][k]=[i for i in path[src][pre]]

# 更新兩個節點集合

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)

節點的遍歷過程如下:

最短路徑輸出:

python 實現演算法 Python實現演算法 一

1.二分查詢 def binary search mylist,item low 0 high len mylist 1 while low high mid low high 2 如果 low high 2不是偶數,python自動將mid向下圓整。guess mylist mid if gues...

python實現快排演算法 Python實現快排

挖坑法思路 取乙個元素p 第乙個元素 使元素p歸位 列表被p分成兩部分,左邊的數一定不大於p,右邊的數一定不小於p 遞迴完成排序。python 示例 lst 5,7,4,3,1,2,9,8 def quick sort d,l,r if l r m partition d,l,r quick sor...

排序演算法python實現

先列出一些演算法複雜度的識別符號號的意思,最常用的是o,表示演算法的上屆,如 2n2 o n2 而且有可能是漸進緊確的,意思是g n 乘上乙個常數係數是可以等於f n 的,就是所謂的a b。而o的區別就是非漸進緊確的,如2n o n2 o n2 確實可以作為2n的上屆,不過比較大,就是所謂的a其他符...