Implementation of Dijkstra in Python

这么简单一个算法,懒得花时间去自己实现,然后就想在网上搜搜看是否有现成可用的。谁知试了几个,搞得一肚子气:写得真是太好(垃)用(圾)了。不是没有注释,就是不规范看起来巨不爽,更甚bug满天飞根本不能执行。也怪自己懒,算了不骂人了,因为下边我贴出的例子也是基于GitHub上一个写得较为顺眼的例子,然后自己包了一下,并解析了一下原作的返回内容,使得它符合我的需求:输入一个src-dst
pair,返回他们之间的distance 与 path。废话不多说,有图有真相:可以运行。需要的拿走用就是了。

from collections import defaultdict
from 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,path
			for 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 = -1
	ret_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	

### ==================== 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 edges
edges = []
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 = ',length
print 'The shortest path is ',Shortest_path

执行结果:

Davy

2015--6-18

时间: 2024-12-28 21:44:32

Implementation of Dijkstra in Python的相关文章

Python 3.5的async和await特性(PEP492翻译)

原因: 1,coroutine容易与正常的generators弄混 2,一个function是否为coroutine由函数体内是否有yield 或者yield from 决定,这不科学. 3,如果在语法上允许yield的地方才能进行异步调用,那诸如with和for语句中都不能执行异步了. 咋解决呢,把coroutine当成一个native的Python语言特性,与generator完全独立. Native coroutines及其新的语法使得在异步条件下定义context manager(上下文

Python著名的lib和开发框架(均为转载)

第一,https://github.com/vinta/awesome-python Awesome Python A curated list of awesome Python frameworks, libraries, software and resources. Inspired by awesome-php. Awesome Python Admin Panels Algorithms and Design Patterns Anti-spam Asset Management A

Python框架、库以及软件资源汇总

转自:http://developer.51cto.com/art/201507/483510.htm 很多来自世界各地的程序员不求回报的写代码为别人造轮子.贡献代码.开发框架.开放源代码使得分散在世界各地的程序员们都能够贡献他们的代码与创新. Python就是这样一门受到全世界各地开源社区支持的语言.Python可以用来开发各种小工具软件.web应用.科学计算.数据分析等等,Python拥有大量的流行框架,比如Django.使用Python框架时,可以根据自己的需求插入不同的模块,比如可以用S

Machine and Deep Learning with Python

Machine and Deep Learning with Python Education Tutorials and courses Supervised learning superstitions cheat sheet Introduction to Deep Learning with Python How to implement a neural network How to build and run your first deep learning network Neur

Awesome Python

Awesome Python  A curated list of awesome Python frameworks, libraries, software and resources. Inspired by awesome-php. Awesome Python Environment Management Package Management Package Repositories Distribution Build Tools Interactive Interpreter Fi

【转】Fibonacci 斐波纳契堆优化 Dijkstra 最短路径算法

话不多说,拿来主义,直接上代码! PS:打印最短路径我还不晓得怎么加,如有哪位大神知道,还请mark一下! 1 /*********************************************************************** 2 * File: FibonacciHeap.java 3 * Author: Keith Schwarz ([email protected]) 4 * 5 * An implementation of a priority queue

Python url_escape

escape.py # -*- coding: utf8 -*- import sys if type('') is not type(b''): def u(s): return s bytes_type = bytes unicode_type = str basestring_type = str else: def u(s): return s.decode('unicode_escape') bytes_type = str unicode_type = unicode basestr

Python开源框架、库、软件和资源大集合

A curated list of awesome Python frameworks, libraries, software and resources. Inspired by awesome-php. Admin Panels Libraries for administrative interfaces. Ajenti - The admin panel your servers deserve. django-suit - Alternative Django Admin-Inter

part10-1 Python常见模块(sys模块、os模块)

Python 有强大的第三方模块,这些第三方模块在实际运用中已经能实现很多的功能,通常不需要重复开发具有相同功能的模块.另外,Python 语言也内置了大量的模块,这些模块已经非常完善,例如对于常见的日期.时间.正则表达式.JSON支持.容器类等都有完善的模块.接下来学习 Python 内置的模块,不过这些模块还在不断的更新中,更详细的模块帮助可查看 Python 库的在线参考手册,https://docs.python.org/3/library/index.html. 一. sys 模块 s