Dijkstra算法的粗略学习
生活随笔
收集整理的這篇文章主要介紹了
Dijkstra算法的粗略学习
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
2019獨角獸企業重金招聘Python工程師標準>>>
#?-*-?coding:?utf-8?-*- ######################################################################### #?Author:?Yao?Kun #?Created?Time:?5/6/2014?PM?3:51:35 #?File?Name:?dijkstra.py #?Description:? ######################################################################### print?"dijkstra" INFINITE?=?10000 #?打印鄰接矩陣 def?print_adj(adj):#?用于按行輸出的臨時string變量print?"adj?matrix?-->?"for?row?in?adj:str_row?=?""for?ele?in?row:str_row?+=?str(ele)?+?"\t"print?str_row,?"\n" #?找到指定下標集合的最小值 def?find_min(lst,?allow_lst):tmp_min?=?INFINITEindex?=?-1for?i?in?range(0,?len(lst)):if?lst[i]?<?tmp_min?and?allow_lst[i]?!=?0:tmp_min?=?lst[i]index?=?ireturn?index #?ori代表初始源點 def?dijkstra(S,?D,?adj,?dist,?ori,?point_num):print?"Core?Alg"#?這樣表示的更容易理解path?=?[]#?初始化D集合和dist集合,dist集合記錄到某點的最小距離for?i?in?range(0,?point_num):if?i?==?ori:dist.append(0)else:dist.append(INFINITE)path.append([ori])D.append(-1)#?print?"dist?:",?dist#?print?"D?:",?D#?一直循環直到S集合滿while?len(S)?<?point_num:#?u代表當前正準備處理的頂點,取得最小值,然后并把這個點從D集合中取出u?=?find_min(dist,?D)D[u]?=?0#?添加u點到S集中S.append(u)for?v?in?range(0,?point_num):if?adj[u][v]?!=?INFINITE?and?D[v]?!=?0:#?Relax?步驟if(dist[v]?>?dist[u]?+?adj[u][v]):dist[v]?=?dist[u]?+?adj[u][v]#?記錄路徑,刪除原來的路徑,將到u的路徑和點v假如到新的路徑中path[v]?=?[]for?i?in?range(0,?len(path[u])):path[v].append(path[u][i])path[v].append(v)return?path #?單源點集合 S?=?[] D?=?[] #?保存到各個頂點距離的最小長度 dist?=?[] #?鄰接矩陣 adj?=?[[INFINITE,????10,???????????INFINITE,???????30,?????????????100],[INFINITE,????INFINITE,?????50,?????????????INFINITE,???????INFINITE],[INFINITE,????INFINITE,?????INFINITE,???????INFINITE,???????10],[INFINITE,????INFINITE,?????20,?????????????INFINITE,???????60],[INFINITE,????INFINITE,?????INFINITE,???????INFINITE,???????INFINITE] ] print_adj(adj) path?=?dijkstra(S,?D,?adj,?dist,?1,?5) print?path轉載于:https://my.oschina.net/hope1ove/blog/274410
總結
以上是生活随笔為你收集整理的Dijkstra算法的粗略学习的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 《每天学点博弈论全集》-读书总结
- 下一篇: 基于Android系统开发的简易音乐播放