void ShortestPath_Dijkstra(MGraph G, int v0, Patharc path, ShortPathTable dist) { int v, w, k, min; int final[MaxVerterNum]; // final[w] = 1表示求得顶点 v0 至 vw的最短路径,即已访问过顶点vw for (v = 0; v < G.vexNum; v++) { final[v] = 0; // 全部顶点初始化为未知最短路径状态 dist[v] = G.Edge[v0][v]; // 将与v0点有连线的顶点加上权值 path[v] = -1; // 初始化路劲数组p为-1 } dist[v0] = 0; // v0至v0路径为0 final[v0] = 1; // v0至v0不需要路径 /* 开始主循环,每次求得v0到某个顶点v的最短路径*/ for (v = 1; v < G.vexNum; v++) { min = INFINITY; // 当前所知离v0顶点的最近距离 for (w = 0; w < G.vexNum; w++) // 寻找离v0最近的顶点 { if (!final[w] && dist[w] < min) { k = w; min = dist[w]; // w顶点离v0顶点更近 } } final[k] = 1; // 将目前找到的最近的顶点置为1 for (w = 0; w < G.vexNum; w++) // 修正当前最短路径及距离 { /* 如果经过v顶点的路径比现在这条路径的长度短的话 */ if (!final[w] && (min + G.Edge[k][w] < dist[w])) { /* 找到了更短的路径,修改D[w]和P[w] */ dist[w] = min + G.Edge[k][w]; // 修改当前路径长度 path[w] = k; } } } }
时间: 2023-11-25 21:05:23 浏览: 78
Dijkstra vb算法 最短路径
4星 · 用户满意度95%
这段代码实现了Dijkstra算法,用于求解带权有向图中单源最短路径问题,其中:
- 参数G表示输入的图结构,包括顶点数和边的权值信息;
- 参数v0表示起始点的编号;
- 参数path表示输出的最短路径数组,记录从起始点到每个顶点的路径上的最后一个中间顶点;
- 参数dist表示输出的最短距离数组,记录从起始点到每个顶点的最短路径长度。
该算法的基本思路是:从起始点开始,逐步扩展最短路径,直到覆盖所有顶点。在每次扩展时,选择距离起始点最近的未访问顶点,并更新与该顶点相邻的所有顶点的最短距离和路径信息。最终得到起始点到所有其他点的最短路径和距离。
具体实现细节包括:
- 初始化dist数组为起始点到各顶点的直接距离,path数组为-1表示未知路径;
- 将起始点标记为已访问,即final[v0] = 1,距离起始点的最短路径长度为0,即dist[v0] = 0;
- 在每一轮循环中,找到距离起始点最近的未访问顶点k,并更新所有与k相邻的未访问顶点的最短距离和路径信息;
- 循环结束后,path数组中保存的路径信息即为从起始点到每个顶点的最短路径上的最后一个中间顶点,dist数组中保存的值即为起始点到每个顶点的最短路径长度。
阅读全文