北京师范大学数据结构教学资料 第8章——图资料教程.ppt
146-* Dijkstra算法可描述如下: ① 初始化: S?{v0}; dist[j]?Edge[0][j], j = 1, 2, …, n-1; // n为图中顶点个数 ② 求出最短路径的长度: dist[k]?min {dist[i]}, i?V-S ; S?S∪{k}; ③ 修改: dist[i]?min{dist[i], dist[k]+Edge[k][i]}, 对于每一个 i?V-S ; ④ 判断:若 S = V, 则算法结束,否则转②。 146-* 计算从单个顶点到其他各顶点最短路径的算法 void ShortestPath (GraphT, E G, T v, E dist[], int path[]) { //Graph是一个带权有向图。dist[j], 0≤jn, 是当前 //求到的从顶点v到顶点j的最短路径长度, path[j], //0≤jn, 存放求到的最短路径。 int n = G.NumberOfVertices(); bool *S = new bool[n]; //最短路径顶点集 int i, j, k; E w, min; for (i = 0; i n; i++) { dist[i] = G.getWeight(v, i); 146-* S[i] = false; if (i != v dist[i] maxValue) path[i] = v; else path[i] = -1; } S[v] = true; dist[v] = 0; //顶点v加入顶点集合 for (i = 0; i n-1; i++) { //求解各顶点最短路径 min = maxValue; int u = v; //选不在S中具有最短路径的顶点u for (j = 0; j n; j++) if (!S[j] dist[j] min) { u = j; min = dist[j];} S[u] = true; //将顶点u加入集合S 146-* for (k = 0; k n; k++) { //修改 w = G.GetWeight(u, k); if (!S[k] w maxValue dist[u]+w dist[k]) { //顶点k未加入S dist[k] = dist[u]+w; path[k] = u; //修改到k的最短路径 } } } } 146-* Dijkstra算法中各辅助数组的最终结果 从表中读取源点0到终点v的最短路径的方法 : 举顶点4为例 path[4] = 2 path[2] = 3 path[3] = 0,反过来排列,得到路径 0, 3, 2, 4,这就是源点0到终点4的最短路径。 0 4 1 2 3 10 50 10 20 60 30 100 序号 顶点 1 顶点 2 顶点 3 顶点 4 Dist 10 50 30 60 path 0 3 0 2 146-* 边上权值为任意值的单源最短路径问题 带权有向图D的某几条边或所有边的长度可能为负值。利用Dijkstra算法,不一定能得到正确的结果。 若设源点v = 0,使用Dijkstra算法所得结果 0 1 2 5 7 -5 146-* 源点0到终点2的最短路径应是0, 1, 2,其长度为2,它小于算法中计算出来的dist[2]的值。 Bellman和Ford提出了从源点逐次绕过其他顶点,以缩短到达终点的最短路径长度的方法。该方法有一个限制条件,即要求图中不能包含有由带负权值的边组成的回路。 5 7 -5 0 1 2 1 1 -2 0 1 2 146-* 当图中没有由带负权值的边组成的回路时,有n 个顶点的图中
您可能关注的文档
最近下载
- 2026年江苏医药职业学院单招综合素质考试题库有答案解析.docx VIP
- 2025江苏医药职业学院单招《数学》题库及答案详解【全国通用】.docx VIP
- 园林植物栽培与养护绪论.ppt VIP
- 2025年春新北师大版数学一年级下册课件 第二单元 图形大变身(一) 第2课时 找1找.pptx VIP
- 2026年江苏医药职业学院单招职业技能考试题库及完整答案详解1套.docx VIP
- 空调VRV—II安装教程.ppt VIP
- 某小区施工组织设计_施工组织设计.doc VIP
- 2025年春新北师大版数学一年级下册课件 第二单元 图形大变身(一) 第1课时 做1做.pptx VIP
- (2026春新版)人教版二年级数学下册第二单元《数量间的乘除关系》PPT课件.pptx
- 小学数学巧算24点专项练习题(每日一练,共16份).docx VIP
原创力文档

文档评论(0)