最短路径算法
2011-08-12 10:19
176 查看
球最短路径的经典算法是----迪杰斯特拉算法。
迪杰斯特拉算法的实现过程和普里姆求最小生成树的算法很相似。主要是先理解算法的实现过程在利用模板处理各个题目的不同要求,达到以不变应万变的效果。
下面给出算法的理论实现:
其基本思想是,设置顶点集合S并不断地作贪心选择来扩充这个集合。一个顶点属于集合S当且仅当从源到该顶点的最短路径长度已知。
初始时,S中仅含有源。设u是G的某一个顶点,把从源到u且中间只经过S中顶点的路称为从源到u的特殊路径,并用数组dist记录当前每个顶点所对应的最短特殊路径长度。Dijkstra算法每次从V-S中取出具有最短特殊路长度的顶点u,将u添加到S中,同时对数组dist作必要的修改。一旦S包含了所有V中顶点,dist就记录了从源到所有其它顶点之间的最短路径长度。
例如,对下图中的有向图,应用Dijkstra算法计算从源顶点1到其它顶点间最短路径的过程列在下表中。
Dijkstra算法的迭代过程:
主题好好理解上图!
下面给出例题来写出该算法的模板:
杭电ACM2544
点击打开链接
更具体的实现请看链接:
http://www.wutianqi.com/?p=1890
迪杰斯特拉算法的实现过程和普里姆求最小生成树的算法很相似。主要是先理解算法的实现过程在利用模板处理各个题目的不同要求,达到以不变应万变的效果。
下面给出算法的理论实现:
其基本思想是,设置顶点集合S并不断地作贪心选择来扩充这个集合。一个顶点属于集合S当且仅当从源到该顶点的最短路径长度已知。
初始时,S中仅含有源。设u是G的某一个顶点,把从源到u且中间只经过S中顶点的路称为从源到u的特殊路径,并用数组dist记录当前每个顶点所对应的最短特殊路径长度。Dijkstra算法每次从V-S中取出具有最短特殊路长度的顶点u,将u添加到S中,同时对数组dist作必要的修改。一旦S包含了所有V中顶点,dist就记录了从源到所有其它顶点之间的最短路径长度。
例如,对下图中的有向图,应用Dijkstra算法计算从源顶点1到其它顶点间最短路径的过程列在下表中。
Dijkstra算法的迭代过程:
主题好好理解上图!
下面给出例题来写出该算法的模板:
杭电ACM2544
点击打开链接
#include <iostream> using namespace std; int map[105][105], vis[105], dist[105], m, n; #define MAX 88888888 void Djstl(int v) { int i,j, tmp_min, newdist; vis[v] = 1; for(i=1; i<=n; i++) dist[i] = map[v][i]; dist[v] = 0; for(i=2; i<=n; i++) { tmp_min = MAX; for(j=1; j<=n; j++) if(tmp_min>dist[j] && vis[j] == 0) { v = j; tmp_min = dist[j]; } vis[v] = 1; for(j=1; j<=n; j++) if(vis[j]==0 && map[v][j]<MAX) { newdist = dist[v] + map[v][j]; if(dist[j]>newdist) dist[j] = newdist; } } } void init() { memset(dist,0,sizeof(dist)); memset(vis,0,sizeof(vis)); int i, j, a, b, c; for(i=1; i<=n; i++) for(j=1; j<=n; j++) map[i][j] = MAX; for(i=1; i<=m; i++) { cin>>a>>b>>c; if(c<map[a][b]) map[a][b] = map[b][a] = c; } } void main() { while(cin>>n>>m && (m+n)) { init(); Djstl(1); cout<<dist <<endl; } }
更具体的实现请看链接:
http://www.wutianqi.com/?p=1890
相关文章推荐
- 图的最短路径算法
- 无向图最短路径算法(C#)实现
- 求最短路径的三种算法: Ford, Dijkstra和Floyd
- lua实现A星最短路径算法
- 单源最短路径算法小结
- 【队列应用一】随机迷宫|随机起点终点*最短路径算法
- Floyd最短路径算法---多源最短路
- 最短路径算法
- 单源最短路径算法模板(Dijkstra+BellmanFrod)
- 最短路径算法
- 图之最短路径:弗洛伊德(Floyd)算法
- 增加回溯的最短路径算法的matlab实现
- SRM 573 D1L2:SkiResorts,最短路径算法
- 数据结构之(图最短路径之)Floyd(弗洛伊德)算法
- 最短路径算法合集
- 每对顶点的最短路径 : Johnson 算法
- Dijkstra 最短路径算法的一种高效率实现
- 学习笔记---街区最短路径问题算法及优化
- 图的邻接矩阵表示与最短路径算法( Dijkstra )代码实现
- Dijkstra(迪杰斯特)算法求单源最短路径