Implementation of Dijkstra in Python,pythondijkstra

來源:互聯網
上載者:User

Implementation of Dijkstra in Python,pythondijkstra

    這麼簡單一個演算法,懶得花時間去自己實現,然後就想在網上搜搜看是否有現成可用的。誰知試了幾個,搞得一肚子氣:寫得真是太好(垃)用(圾)了。不是沒有注釋,就是不規範看起來巨不爽,更甚bug滿天飛根本不能執行。也怪自己懶,算了不罵人了,因為下邊我貼出的例子也是基於GitHub上一個寫得較為順眼的例子,然後自己包了一下,並解析了一下原作的返回內容,使得它符合我的需求:輸入一個src-dst pair,返回他們之間的 distance 與 path。廢話不多說,有圖有真相:可以運行。需要的拿走用就是了。

====== A. Code: (The dijkstra_raw(...) is the borrowed function, the dijkstra(...) is my design.)

from collections import defaultdictfrom heapq import *def dijkstra_raw(edges, from_node, to_node):g = defaultdict(list)for l,r,c in edges:g[l].append((c,r))q, seen = [(0,from_node,())], set()while q:(cost,v1,path) = heappop(q)if v1 not in seen:seen.add(v1)path = (v1, path)if v1 == to_node:return cost,pathfor c, v2 in g.get(v1, ()):if v2 not in seen:heappush(q, (cost+c, v2, path))return float("inf"),[]def dijkstra(edges, from_node, to_node):len_shortest_path = -1ret_path=[]length,path_queue = dijkstra_raw(edges, from_node, to_node)if len(path_queue)>0:len_shortest_path = length## 1. Get the length firstly;## 2. Decompose the path_queue, to get the passing nodes in the shortest path.left = path_queue[0]ret_path.append(left)## 2.1 Record the destination node firstly;right = path_queue[1]while len(right)>0:left = right[0]ret_path.append(left)## 2.2 Record other nodes, till the source-node.right = right[1]ret_path.reverse()## 3. Reverse the list finally, to make it be normal sequence.return len_shortest_path,ret_path

====== B. The topology used in the following use-case:


====== C. Use-case:

### ==================== Given a list of nodes in topology.list_nodes_id = [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20];### ==================== Given constants matrix of topology.M=99999# This represents a large distance. It means that there is no link.M_topo = [[M, 1,1,M,1,M, 1,1,1,M,M, M,M,M,M,M, M,M,M,M,M],[1, M,1,M,M,1, M,M,M,M,M, M,M,M,M,M, M,M,M,M,M],[1, 1,M,1,M,M, M,M,M,M,M, M,M,M,M,M, M,M,M,M,M],[M, M,1,M,1,M, M,M,M,M,M, M,M,M,M,M, M,M,M,M,M],[1, M,M,1,M,M, M,M,M,1,1, 1,M,M,M,M, M,M,M,M,M],[M, 1,M,M,M,M, 1,M,M,M,M, M,M,M,M,M, M,M,M,M,M],[1, M,M,M,M,1, M,1,M,M,M, M,M,M,M,M, M,M,M,M,M],[1, M,M,M,M,M, 1,M,1,M,M, M,M,M,M,M, M,M,M,M,M],[1, M,M,M,M,M, M,1,M,1,M, M,1,M,M,M, M,M,M,M,M],[M, M,M,M,1,M, M,M,1,M,M, 1,M,M,M,M, M,M,M,M,M],[M, M,M,M,1,M, M,M,M,M,M, 1,M,1,M,M, M,M,M,M,M],[M, M,M,M,1,M, M,M,M,1,1, M,M,1,1,M, M,M,M,M,M],[M, M,M,M,M,M, M,M,1,M,M, M,M,M,1,M, M,M,M,M,M],[M, M,M,M,M,M, M,M,M,M,1, 1,M,M,1,M, M,1,1,M,M],[M, M,M,M,M,M, M,M,M,M,M, 1,1,1,M,1, 1,M,M,M,M],[M, M,M,M,M,M, M,M,M,M,M, M,M,M,1,M, 1,M,1,1,M],[M, M,M,M,M,M, M,M,M,M,M, M,M,M,1,1, M,M,M,M,1],[M, M,M,M,M,M, M,M,M,M,M, M,M,1,M,M, M,M,1,M,M],[M, M,M,M,M,M, M,M,M,M,M, M,M,1,M,1, M,1,M,1,M],[M, M,M,M,M,M, M,M,M,M,M, M,M,M,M,1, M,M,1,M,1],[M, M,M,M,M,M, M,M,M,M,M, M,M,M,M,M, 1,M,M,1,M]]### --- Read the topology, and generate all edgesedges = []for i in range(len(M_topo)):for j in range(len(M_topo[0])):if i!=j and M_topo[i][j]!=M:edges.append((i,j,M_topo[i][j]))print "=== Dijkstra ==="print "Let's find the shortest-path from 0 to 9:"length,Shortest_path = dijkstra(edges, 0, 9)print 'length = ',lengthprint 'The shortest path is ',Shortest_path


====== D. 執行結果:


Davy

2015--6-18

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.