注意: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其他符...