北京师范大学数据结构教学资料 第8章——图资料教程.ppt

北京师范大学数据结构教学资料 第8章——图资料教程.ppt

北京师范大学数据结构教学资料 第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 个顶点的图中

文档评论(0)

1亿VIP精品文档

相关文档