练习 Dijkstra 最短路径算法。
练习 Dijkstra 最短路径算法。
#coding: utf-8
# Author: woodfox, Oct 14, 2014
# http://en.wikipedia.org/wiki/Dijkstra%27s_algorithm
"""
Let the node at which we are starting be called the initial node. Let the distance of node Y be the distance from the initial node to Y. Dijkstra's algorithm will assign some initial distance values and will try to improve them step by step.
1. Assign to every node a tentative distance value: set it to zero for our initial node and to infinity for all other nodes.
2. Mark all nodes unvisited. Set the initial node as current. Create a set of the unvisited nodes called the unvisited set consisting of all the nodes.
3. For the current node, consider all of its unvisited neighbors and calculate their tentative distances. Compare the newly calculated tentative distance to the current assigned value and assign the smaller one. For example, if the current node A is marked with a distance of 6, and the edge connecting it with a neighbor B has length 2, then the distance to B (through A) will be 6 + 2 = 8. If B was previously marked with a distance greater than 8 then change it to 8. Otherwise, keep the current value.
4. When we are done considering all of the neighbors of the current node, mark the current node as visited and remove it from the unvisited set. A visited node will never be checked again.
5. If the destination node has been marked visited (when planning a route between two specific nodes) or if the smallest tentative distance among the nodes in the unvisited set is infinity (when planning a complete traversal; occurs when there is no connection between the initial node and remaining unvisited nodes), then stop. The algorithm has finished.
6. Select the unvisited node that is marked with the smallest tentative distance, and set it as the new "current node" then go back to step 3.
"""
vertices = [1, 2, 3, 4, 5, 6]
# element structure is: [node1, node2, cost]
edges = [[1, 6, 14], [1, 2, 7], [1, 3, 9], [3, 6, 2], [2, 3, 10], [3, 4, 11], [2, 4, 15], [6, 5, 9], [5, 4, 6]]
def get_neighbors(node):
# key is neighbor's node number, value is cost
result = {}
for edge in edges:
if edge[0] == node:
other = edge[1]
elif edge[1] == node:
other = edge[0]
else:
continue
result[other] = edge[2] # cost
return result
#print(get_neighbors(3))
#print(get_neighbors(5))
MAX_VALUE = 10000
def shorted_path(start, end):
unvisited = []
visited = []
costs = {}
#result_path = []
for v in vertices:
if v == start:
costs[v] = 0
else:
costs[v] = MAX_VALUE
unvisited.append(v)
#print unvisited
#print costs
current = start
#result_path.append(current)
while True:
neighbors = get_neighbors(current)
min_cost_of_neighbor = MAX_VALUE
min_cost_n = None
if len(neighbors.keys()) > 0:
for n, cost in neighbors.iteritems():
if n in visited:
continue
new_cost = costs[current] + cost
if new_cost < costs[n]:
costs[n] = new_cost
if costs[n] < min_cost_of_neighbor:
min_cost_of_neighbor = costs[n]
min_cost_n = n
visited.append(current)
#print visited, unvisited, current, min_cost_n
unvisited.remove(current)
if min_cost_n != None:
current = min_cost_n
if end in visited:
break
#print costs
return costs[end]
print shorted_path(1, 5)
测试:
Running “dijkstra_test.py”…
Python 2.7.8teaser
Theme:
20
copy output
Program exited with code #0 after 0.05 seconds.
练习 Dijkstra 最短路径算法。的更多相关文章
- Java邻接表表示加权有向图,附dijkstra最短路径算法
从A到B,有多条路线,要找出最短路线,应该用哪种数据结构来存储这些数据. 这不是显然的考查图论的相关知识了么, 1.图的两种表示方式: 邻接矩阵:二维数组搞定. 邻接表:Map<Vertext, ...
- 数据结构(c++)(第二版) Dijkstra最短路径算法 教学示范代码出现重大问题!
前言 去年在数据结构(c++)的Dijkstra教学算法案例中,发现了一个 bug 导致算法不能正常的运行,出错代码只是4行的for循环迭代代码. 看到那里就觉得有问题,但书中只给了关键代码的部分,其 ...
- Dijkstra最短路径算法[贪心]
Dijkstra算法的标记和结构与prim算法的用法十分相似.它们两者都会从余下顶点的优先队列中选择下一个顶点来构造一颗扩展树.但千万不要把它们混淆了.它们解决的是不同的问题,因此,所操作的优先级也是 ...
- 一篇文章讲透Dijkstra最短路径算法
Dijkstra是典型最短路径算法,计算一个起始节点到路径中其他所有节点的最短路径的算法和思想.在一些专业课程中如数据结构,图论,运筹学等都有介绍.其思想是一种基础的求最短路径的算法,通过基础思想的变 ...
- Python 图_系列之纵横对比 Bellman-Ford 和 Dijkstra 最短路径算法
1. 前言 因无向.无加权图的任意顶点之间的最短路径由顶点之间的边数决定,可以直接使用原始定义的广度优先搜索算法查找. 但是,无论是有向.还是无向,只要是加权图,最短路径长度的定义是:起点到终点之间所 ...
- Dijkstra最短路径算法实例
#include <stdio.h>#include <stdlib.h>/* Dijkstra算法 */#define VNUM 5#define MV 65536int P ...
- 关于Dijkstra最短路径算法
Dijkstra算法,不是很明白,今天找了一些博客看了一下,决定自己也写一个为以后忘记的时候可以看做准备. 实际上,如果理解没错的话,该算法实际上和枚举法有点像,只不过,在选取出发路径的路径都是最短路 ...
- SRM 583 Div II Level Three:GameOnABoard,Dijkstra最短路径算法
题目来源:http://community.topcoder.com/stat?c=problem_statement&pm=12556 用Dijkstra实现,之前用Floyd算法写了一个, ...
- Dijkstra 最短路径算法 秒懂详解
想必大家一定会Floyd了吧,Floyd只要暴力的三个for就可以出来,代码好背,也好理解,但缺点就是时间复杂度高是O(n³). 于是今天就给大家带来一种时间复杂度是O(n²),的算法:Dijkstr ...
随机推荐
- hiberante 二级缓存设置
<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.spr ...
- 翻译记忆软件-塔多思TRADO经典教程_5
TRADOS新手必读 共有篇贴子 TRADOS新手必读 译海撷英系列之软件漫谈之TRADOS新手必读 作者:苏任 我很喜欢到翻译中国网站上来四处看看,一开始主要是关心应用资料和软件,后来就对网友的 ...
- Linux不用使用软件把纯文本文档转换成PDF文件的方法
当你有一大堆文本文件要维护的时候,把它们转换成PDF文档会好一些.比如,PDF更适合打印,因为PDF文档有预定义布局.除此之外,还可以减少文档被意外修改的风险. 要将文本文件转换成PDF格式,你要按照 ...
- 在命令行上 Ubuntu 下使用 mutt 和 msmtp 发送 Gmail 邮件
在命令行写email from ubuntu 参考: http://www.habadog.com/2011/11/23/send-mail-with-msmtp-mutt-linux ...
- Ubuntu解压缩zip,tar,tar.gz,tar.bz2
ZIP zip可能是目前使用得最多的文档压缩格式.它最大的优点就是在不同的操作系统平台,比如Linux, Windows以及Mac OS,上使用.缺点就是支持的压缩率不是很高,而tar.gz和tar. ...
- linux too many open files报错
修改方法:vi /etc/security/limits.conf 增加一行,如下: * - nofile 65535 修改vi /etc/ssh/sshd ...
- poj 2187 Beauty Contest , 旋转卡壳求凸包的直径的平方
旋转卡壳求凸包的直径的平方 板子题 #include<cstdio> #include<vector> #include<cmath> #include<al ...
- 转发:消息发布时间展示为刚刚、几分钟前、几小时前等等(php篇)
一.思路解析区: 1.获取当前的时间: 2.获取发布的时间: 3.计算两个的时间差: 4.判断这个时间差的范围给出对应的结果: 二.代码展示区: function tranTime($time) { ...
- PHP-表达式
最精确的定义一个表达式的方式就是"任何有值的东西" $a = 5; 1 > 2;等
- JavaScript-各种插件
上传插件: 首推:uploadify http://www.admin10000.com/document/2980.html 滚动条插件: http://www.admin10000.com/doc ...