迪杰斯特拉算法(dijkstra)——最短路径
来源:互联网 发布:黄岛java开发招聘信息 编辑:程序博客网 时间:2024/05/16 23:36
迪杰斯特拉算法是从一个顶点到其余各顶点的最短路径算法,解决的是有向图中最短路径问题。迪杰斯特拉算法主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止。
1、定义
Dijkstra算法是典型的算法。Dijkstra算法是很有代表性的算法。Dijkstra一般的表述通常有两种方式,一种用永久和临时标号方式,一种是用OPEN, CLOSE表的方式,这里均采用永久和临时标号的方式。注意该算法要求图中不存在负权边。
2、原理
首先,引进一个辅助向量D,它的每个分量D[i]表示当前所找到的从始点v到每个终点vi的的长度:如D[3]=2表示从始点v到终点3的路径相对最小长度为2。这里强调相对就是说在算法过程中D的值是在不断逼近最终结果但在过程中不一定就等于长度。它的初始状态为:若从v到vi有弧,则D为弧上的权值;否则置D为∞。显然,长度为 D[j]=Min{D | vi∈V} 的路径就是从v出发的长度最短的一条。此路径为(v,vj)。 那么,下一条长度次短的是哪一条呢?假设该次短路径的终点是vk,则可想而知,这条路径或者是(v,vk),或者是(v,vj,vk)。它的长度或者是从v到vk的弧上的权值,或者是D[j]和从vj到vk的弧上的权值之和。 一般情况下,假设S为已求得的终点的集合,则可证明:下一条最短路径(设其终点为X)或者是弧(v,x),或者是中间只经过S中的顶点而最后到达顶点X的路径。因此,下一条长度次短的的长度必是D[j]=Min{D | vi∈V-S} 其中,D或者是弧(v,vi)上的权值,或者是D[k](vk∈S)和弧(vk,vi)上的权值之和。
3、问题描述
在无向图 G=(V,E) 中,假设每条边 E[i] 的长度为 w[i],找到由顶点 V0 到其余各点的最短值。
4、算法思想
执行动画过程如下图
5、算法代码实现
const int MAXINT = 32767;const int MAXNUM = 10;int dist[MAXNUM];int prev[MAXNUM];int A[MAXUNM][MAXNUM];void Dijkstra(int v0){ bool S[MAXNUM]; // 判断是否已存入该点到S集合中 int n=MAXNUM; for(int i=1; i<=n; ++i) { dist[i] = A[v0][i]; S[i] = false; // 初始都未用过该点 if(dist[i] == MAXINT) prev[i] = -1; else prev[i] = v0; } dist[v0] = 0; S[v0] = true; for(int i=2; i<=n; i++) { int mindist = MAXINT; int u = v0; // 找出当前未使用的点j的dist[j]最小值 for(int j=1; j<=n; ++j) if((!S[j]) && dist[j]<mindist) { u = j; // u保存当前邻接点中距离最小的点的号码 mindist = dist[j]; } S[u] = true; for(int j=1; j<=n; j++) if((!S[j]) && A[u][j]<MAXINT) { if(dist[u] + A[u][j] < dist[j]) //在通过新加入的u点路径找到离v0点更短的路径 { dist[j] = dist[u] + A[u][j]; //更新dist prev[j] = u; //记录前驱顶点 } } }}
- 最短路径算法—Dijkstra(迪杰斯特拉)
- 最短路径算法—Dijkstra(迪杰斯特拉)
- 最短路径算法(1)—Dijkstra(迪杰斯特拉)算法
- 迪杰斯特拉算法(dijkstra)——最短路径
- 经典算法——迪杰斯特拉(Dijkstra)最短路径
- 最短路径算法——Dijkstra
- 最短路径——Dijkstra算法
- 最短路径——Dijkstra算法
- 最短路径—Dijkstra算法
- 最短路径Ⅰ—Dijkstra算法
- 最短路径—Dijkstra算法
- 最短路径—Dijkstra算法
- 最短路径—Dijkstra算法
- 最短路径—Dijkstra算法
- Dijkstra — 最短路径算法
- 最短路径—Dijkstra算法
- 最短路径—Dijkstra算法
- 最短路径—Dijkstra算法
- C语言杂记(1)
- 【BZOJ】2152: 聪聪可可 点分治
- 【二分图|推理+最大匹配】POJ-1043 What's In A Name?
- [DS] Hashing -- Shortest Ver ?
- 1029. Median (25)
- 迪杰斯特拉算法(dijkstra)——最短路径
- 第十一周 项目3 程序的多文件组织
- APUE-chapter-4.10(打印st_dev 和 st_rdev)
- 总结linux下遇到的问题
- 数字电路设计之VGA的字母显示的verilog实现
- cookie的操作
- sqoop相关整理记录
- 字符串转日期 遇到Is not a valid date and time的解决
- Cache写策略 — write-through与 write-back