工学最短路径.pptxVIP

  • 1
  • 0
  • 约2.17千字
  • 约 18页
  • 2019-11-28 发布于上海
  • 举报
单元实验六 ------图的最短路径 ;最短路径;单源点最短路径;Dijkstra算法的基本思想 按路径长度递增顺序求最短路径算法;Dijkstra算法的基本思想 按路径长度递增顺序求最短路径算法,采用邻接矩阵存储结构;Dijkstra算法的基本思想 按路径长度递增顺序求最短路径算法。;;;数据结构 一维数组final[] 表示顶点集合S 一维数组D[] D[i]: 源点到顶点i的路径长度 邻接矩阵 arcs[j][k]:顶点j与k所关联的边的权值 ;设V0是源点,S是已求得最短路径的终点集合,则V-S是未确定最短路径的顶点的集合。初始时 S ={V0},D[i]用于保存从源点出发到达顶点Vi的最短路径长度。;设V0是源点,S是已求得最短路径的终点集合,则V-S是未确定最短路径的顶点的集合。初始时 S ={V0},D[i]用于保存从源点出发到达顶点Vi的最短路径长度。;初始时,若源点到顶点Vi有边,则D[i]为边上的权值;否则,D[i]为∞。;数据结构: arcs[][], D[] final[]表示集合S: final[i]=true,顶点i在集合S中 final[i]=false,顶点i不在集合S中 P[][]表示路径中的顶点集合: P[v][w]=true,w是源点到顶点v最短路径上的顶点 P[v][w]=false,w不是源点到顶点v最短路径上的顶点;D[V0] = 0; final[V0] = true; //集合S置初值 for(i=1; iG.vexnum; i++) { //求其余顶点的最短路径 min = INFINITY; for(k = 0; kG.vexnum; ++k) if (final[k]==false) //顶点Vk不在集合S中 if (D[k]min) { j = k; min = D[k]; } // V0至Vk的路径长度更短时,更新min并用j记下顶点k final[j] = true; //顶点Vj加入集合S //根据需要更新其余终点的路径; }//for;D[v0] = 0; final[v0] = true; //集合S置初值 for(i=1; vG.vexnum; i++) { //求其余终点的最短路径 min = INFINITY; for(k=0; kG.vexnum; ++k) if (final[k]==false) //顶点Vk不在集合S中 if (D[k]min) { j = k; min = D[k]; } final[j] = true; //求出了V0到Vj的最短路径,将Vj加入集合S for(k=0; kG.vexnum; ++k) //更新其余顶点的路径及长度 if (final[k]==false (D[j]+G.arcs[j][k]D[k])) { D[k] = D[j] + G.arcs[j][k]; //更新Vk的路径长度 for(i=0;iG.vexnum;++i) P[k][i] = P[j][i]; //更新Vk的路径 P[k][k] = true; //将Vk加入V0到Vk的路径中 }//if }//for;迪杰斯特拉(Dijkstra)算法;D[v0] = 0; final[v0] = true; //集合S置初值 for(i=1; vG.vexnum; i++) { //求其余终点的最短路径 min = INFINITY; for(k=0; kG.vexnum; ++k) if (final[k]==false) //顶点Vk不在集合S中 if (D[k]min) { j = k; min = D[k]; } final[j] = true; //求出了V0到Vj的最短路径,将Vj加入集合S for(k=0; kG.vexnum; ++k) if (final[k]==false (D[j]+G.arcs[j][k]D[k])) { D[k] = D[j] + G.arcs[j][k]; //更

文档评论(0)

1亿VIP精品文档

相关文档