最短路径算法-Dijkstra
Dijkstra是解决单源最短路径的一般方法,属于一种贪婪算法。
所谓单源最短路径是指在一个赋权有向图中,从某一点出发,到另一点的最短路径。
以python代码为例,实现Dijkstra算法
1、数据结构设计
假设图以单边列表的方式进行输入,本例使用如下的一个图来进行分析:
E = ((1,2,2),
(1,4,1),
(2,4,3),
(2,5,10),
(3,1,4),
(3,6,5),
(4,3,2),
(4,6,8),
(4,7,4),
(4,5,2),
(5,7,6),
(7,6,1))
E表示一个图,它是一个二维列表,三个一组表示一条边,三个值分别为边的起点、终点,以及该边的权值。
上面这个边列表表示的图如下:

只设计一个顶点结构就OK了,顶点的表示如下:
class V_NODE(object):
def __init__(self, id):
self.id = id
self.adja_list = 0
self.path = 0
self.kown = False
self.dist = float("inf")
id表示顶点的编号;
path表示到该顶点对应的最优路径的上一个顶点;
kown用来记录改点的最短路径是否已经找到;
dist表示改点当前路径的长度;
adja_list用来存放改顶点的邻接点的列表,采用二维列表,每个元组有两个值:与改点相邻的点的id、到该点的路径的长度
2、算法实现
def read_graph(edge):
hash = {}
for e in edge:
if hash.has_key(e[0]):
hash[e[0]].adja_list.append([e[1],e[2]])
else:
v = V_NODE(e[0])
v.adja_list=[[e[1],e[2]]]
hash[e[0]] = v
if hash.has_key(e[1]) == False:
v = V_NODE(e[1])
v.adja_list=[]
hash[e[1]] = v
return hash def find_best_unkown(hash_unkown):
dist = float("inf")
id = -1
for k in hash_unkown.keys():
if dist > hash_unkown[k].dist:
dist = hash_unkown[k].dist
id = k
return id def print_path(hash_kown, v1, v2):
b_str = "%d to %d: " % (v1,v2)
if hash_kown.has_key(v2) == False :
print b_str + "no way form %d to %d" % (v1, v2)
return str = ""
while v2 != v1:
str = "->%d" % v2 + str
v2 = hash_kown[v2].path
str = "%d" % v2 + str
print b_str + str def find_best(edges, v1, v2):
hash_unkown = read_graph(edges)
hash_unkown[v1].dist = 0
hash_unkown[v1].path = v1
hash_kown = {}
while 1:
v_id = find_best_unkown(hash_unkown)
#print "best: %d" % v_id
if v_id < 0 :
break
hash_unkown[v_id].kown = True
hash_kown[v_id] = hash_unkown[v_id]
del hash_unkown[v_id]
for w in hash_kown[v_id].adja_list:
if hash_unkown.has_key(w[0]):
if hash_kown[v_id].dist + w[1] < hash_unkown[w[0]].dist:
hash_unkown[w[0]].dist = hash_kown[v_id].dist + w[1]
hash_unkown[w[0]].path = v_id #for k in hash_kown.keys():
# hash_kown[k].show() print_path(hash_kown,v1,v2) # for test...
for i in range(1,8):
for j in range(1,8):
find_best(E, i, j)
首先实现函数read_graph,它读入一个以单边列表表示的图,输出一个带有邻接表的顶点哈希表;
然后实现函数find_best_unkown,它在未知顶点中寻找距源点路径最短的一个顶点并返回其id;
print_path函数用来打印出某个指定顶点的路径信息;
最终实现find_best函数,它接收一个图的单边列表,以及源点v1和终点v2,然后计算并打印出v1到v2的最短路径。
最后还有个for循环用来测试,将任意两点间的最优路径都计算出来。
最短路径算法-Dijkstra的更多相关文章
- 最短路径算法Dijkstra和A*
在设计基于地图的游戏,特别是isometric斜45度视角游戏时,几乎必须要用到最短路径算法.Dijkstra算法是寻找当前最优路径(距离原点最近),如果遇到更短的路径,则修改路径(边松弛). Ast ...
- 最短路径算法-Dijkstra算法的应用之单词转换(词梯问题)(转)
一,问题描述 在英文单词表中,有一些单词非常相似,它们可以通过只变换一个字符而得到另一个单词.比如:hive-->five:wine-->line:line-->nine:nine- ...
- 有向有权图的最短路径算法--Dijkstra算法
Dijkstra算法 1.定义概览 Dijkstra(迪杰斯特拉)算法是典型的单源最短路径算法,用于计算一个节点到其他所有节点的最短路径.主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止.Di ...
- 带权图的最短路径算法(Dijkstra)实现
一,介绍 本文实现带权图的最短路径算法.给定图中一个顶点,求解该顶点到图中所有其他顶点的最短路径 以及 最短路径的长度.在决定写这篇文章之前,在网上找了很多关于Dijkstra算法实现,但大部分是不带 ...
- 最短路径算法——Dijkstra,Bellman-Ford,Floyd-Warshall,Johnson
根据DSqiu的blog整理出来 :http://dsqiu.iteye.com/blog/1689163 PS:模板是自己写的,如有错误欢迎指出~ 本文内容框架: §1 Dijkstra算法 §2 ...
- 最短路径算法——Dijkstra算法
在路由选择算法中都要用到求最短路径算法.最出名的求最短路径算法有两个,即Bellman-Ford算法和Dijkstra算法.这两种算法的思路不同,但得出的结果是相同的. 下面只介绍Dijkstra算法 ...
- 最短路径算法——Dijkstra算法与Floyd算法
转自:https://www.cnblogs.com/smile233/p/8303673.html 最短路径 ①在非网图中,最短路径是指两顶点之间经历的边数最少的路径. AE:1 ADE:2 ...
- 单源最短路径算法---Dijkstra
Dijkstra算法树解决有向图G=(V,E)上带权的单源最短路径问题,但是要求所有边的权值非负. 解题思路: V表示有向图的所有顶点集合,S表示那么一些顶点结合,从源点s到该集合中的顶点的最终最短路 ...
- 最短路径算法—Dijkstra(迪杰斯特拉)算法分析与实现(C/C++)
Dijkstra算法 ———————————最后更新时间:2011.9.25———————————Dijkstra(迪杰斯特拉)算法是典型的最短路径路由算法,用于计算一个节点到其他所有节点的最短路径. ...
随机推荐
- Git(进击学习:远程仓库操作)-V3.0
1.查看当前的远程仓库:git remote或git remote -v 2.添加远程仓库:git remote add [shortname] [url] git remote add pb git ...
- 学习笔记之(console)
今天小颖在逛博客园时,发现一位帅锅写的有意思的Console小颖看了后,就自己敲了一遍嘻嘻,为了方便以后查看,小颖把它记录下来嘻嘻,有兴趣的小伙伴也可以自己试试哦. 格式占位符 作用 %s 字符串 % ...
- 从零开始编写自己的C#框架(23)——上传组件使用说明
文章导航 1.前言 2.上传组件功能说明 3.数据库结构 4.上传配置管理 5.上传组件所使用到的类 6.上传组件调用方法 7.效果演示 8.小结 1.前言 本系列所使用的是上传组件是大神July开发 ...
- H5 Notes:PostMessage Cross-Origin Communication
Javascript中要实现跨域通信,主要有window.name,jsonp,document.domain,cors等方法.不过在H5中有一种新的方法postMessage可以安全实现跨域通信,并 ...
- 设计模式(九): 从醋溜土豆丝和清炒苦瓜中来学习"模板方法模式"(Template Method Pattern)
今天是五.四青年节,祝大家节日快乐.看着今天这标题就有食欲,夏天到了,醋溜土豆丝和清炒苦瓜适合夏天吃,好吃不上火.这两道菜大部分人都应该吃过,特别是醋溜土豆丝,作为“鲁菜”的代表作之一更是为大众所熟知 ...
- CRL快速开发框架升级到3.1
CRL是一款面向对象的轻量级ORM框架,本着快速开发,使用简便的原则,设计为 无需关心数据库结构,CRL自动维护创建,即写即用(CRL内部有表结构检查机制,保证表结构一致性) 无需第三方工具生成代理类 ...
- 多线程条件通行工具——CyclicBarrier
CyclicBarrier的作用是,线程进入等待后,需要达到一定数量的等待线程后,再一次性开放通行. CyclicBarrier(int, Runnable)构造方法,参数1为通行所需的线程数量,参数 ...
- 成吨提高开发效率:Intellij Shortcuts精简子集与思维模式
在线精简cheatsheet备查表:intellij.linesh.twGithub项目:intellij-mac-frequent-keymap Intellij的快捷键多而繁杂,从官方推荐的key ...
- EC笔记:第4部分:19、设计class犹如设计type
设计一个class,应该考虑以下问题: 新type的对象应该怎样创建和销毁? 构造函数 析构函数 内存分配 内存释放 对象的初始化和对象的赋值应该有什么样的差别? 拷贝构造函数 赋值运算符 新对象如果 ...
- Inter1-关于i++和++i
Q:关于i++和++i计算以下公式的结果 ```public static void main(String[] args) { int i = 1; System.out.println(" ...