Algorithms Part 1-Question 5- Dijkstra's shortest-path-最短路径算法
来源:互联网 发布:有生日提醒软件 编辑:程序博客网 时间:2024/05/16 19:31
Algorithms: Design and Analysis, Part 1
最短路径算法题目要求
本次要求对于一个200个点的无向图应用著名的Dijkstra算法求最短路径。可以选择用heap来计算,速度更快。我采用python语言,用了多个字典来加快速度。
In this programming problem you'll code up Dijkstra's shortest-path algorithm.
Download the text file here. (Right click and save link as).
The file contains an adjacency list representation of an undirected weighted graph with 200 vertices labeled 1 to 200. Each row consists of the node tuples that are adjacent to that particular vertex along with the length of that edge. For example, the 6th row has 6 as the first entry indicating that this row corresponds to the vertex labeled 6. The next entry of this row "141,8200" indicates that there is an edge between vertex 6 and vertex 141 that has length 8200. The rest of the pairs of this row indicate the other vertices adjacent to vertex 6 and the lengths of the corresponding edges.
Your task is to run Dijkstra's shortest-path algorithm on this graph, using 1 (the first vertex) as the source vertex, and to compute the shortest-path distances between 1 and every other vertex of the graph. If there is no path between a vertex v and vertex 1, we'll define the shortest-path distance between 1 and v to be 1000000.
You should report the shortest-path distances to the following ten vertices, in order: 7,37,59,82,99,115,133,165,188,197. You should encode the distances as a comma-separated string of integers. So if you find that all ten of these vertices except 115 are at distance 1000 away from vertex 1 and 115 is 2000 distance away, then your answer should be 1000,1000,1000,1000,1000,2000,1000,1000,1000,1000. Remember the order of reporting DOES MATTER, and the string should be in the same order in which the above ten vertices are given. Please type your answer in the space provided.
IMPLEMENTATION NOTES: This graph is small enough that the straightforward O(mn) time implementation of Dijkstra's algorithm should work fine. OPTIONAL: For those of you seeking an additional challenge, try implementing the heap-based version. Note this requires a heap that supports deletions, and you'll probably need to maintain some kind of mapping between vertices and their positions in the heap.
算法实现
这个算法比较简单,跟着课程走,实现要求的数据结构就ok了。当然最后要选择题目要求的点的距离,使用list comprehension可以加快这一过程。
整个算法实现中,全部以字典实现,速度较快。
代码如下:
f=open('dijkstraData.txt','r')vertices=dict()for line in f.readlines(): tmp=line.split() try: vertices[int(tmp[0])]={int(x.split(',')[0]):int(x.split(',')[1]) for x in tmp[1:]} except: print('error'+tmp)f.closelength=200exped=[1]noexped=list(range(2,length+1))distance={x:0 for x in range(1,length+1)}while len(exped)<length: maxlimit=1000000 tmpdist=maxlimit lenvw=tmpdist for v in exped: for w in noexped: if w in vertices[v].keys(): lenvw=distance[v]+vertices[v][w] if lenvw<tmpdist: tmpdist=lenvw tmpv=v tmpw=w if tmpdist==maxlimit:break exped.append(tmpw) noexped.remove(tmpw) distance[tmpw]=tmpdistprint('distance is')print(distance)print('max distance is: '+str(max(distance.values())))for ind in [7,37,59,82,99,115,133,165,188,197]: print(str(ind)+' is : '+str(distance[ind]))
在对大型数据进行处理前,不妨采用小的数据集进行测试。
这是测试使用的txt文件:
1 2,7 3,9 6,142 1,7 3,10 4,153 1,9 2,10 4,11 6,24 2,15 3,11 5,65 4,6 6,96 1,14 3,2 5,9
计算结果是:
distance is{1: 0, 2: 7, 3: 9, 4: 20, 5: 20, 6: 11}max distance is: 20
- Algorithms Part 1-Question 5- Dijkstra's shortest-path-最短路径算法
- 【Python排序搜索基本算法】之Dijkstra最短路径算法(Dijkstra's Shortest-Path Algorithm)
- 最短路径算法(Shortest-path Algorithms)
- GeeksForGeeks-Dijkstra’s shortest path algorithm最短路径
- 最短路径图算法(shortest path dijkstra)
- 最短路径(SPF - Shortest Path Firsh) - Dijkstra算法
- 两点之间最短路径算法(Single-Dijkstra-shortest path)
- [C++]C++ STL Dijkstra算法 存储多条相同最短路径 shortest path
- 最短路径 Part I- Single source shortest path
- Part Acquisition(最短路径Dijkstra算法+路径输出)
- 最短路径(Shortest Path)
- Relaxation step(Dijkstra's 最短路径算法)
- Part Acquisition--(最短路径,Dijkstra)
- DIJKSTRA最短路径算法
- 最短路径算法-dijkstra
- dijkstra最短路径算法
- 最短路径 Dijkstra算法
- 最短路径(Dijkstra算法)
- android 读写文本
- VC6.0下配置EON SDK
- C++语法表达式规则的建立基础
- puts()函数和printf函数的区别
- 技能是重要的
- Algorithms Part 1-Question 5- Dijkstra's shortest-path-最短路径算法
- Module for Steepest Descent or Gradient Method
- OpenCV-图像几何变换:旋转,缩放,斜切
- 设计模式心得体会(陆续更新)
- KNOW: Hash Table
- 我说的话能信吗?如今自己也不信,错了该
- Python学习笔记--调试器debugger
- 凸包[C程序]
- 直通车