1 void dijisitela(int d, int m1) 2 { 3 int dis[1000], book[1000], path[1000], u, v, min; 4 l = 1; 5 for (i = 0; i < n1; i++) 6 { 7 dis[i] = w[d][i]; 8 book[i] = 0; 9 path[i] = -1; 10 midpath[0][i] = -1; 11 } 12 midsum[0] = 0; 13 book[0] = d; 14 15 //Dijkstra算法核心语句 16 for (i = 0; i < n1 - 1; i++) 17 { 18 //找到离d号顶点最近的顶点 19 min = fmax; 20 for (j = 0; j < n1; j++) 21 { 22 if (book[j] == 0 && dis[j] < min) 23 { 24 min = dis[j]; 25 u = j; 26 } 27 } 28 book[u] = 1; 29 for (v = 0; v < n1; v++) 30 { 31 if (w[u][v] < fmax) 32 { 33 if (dis[v] > dis[u] + w[u][v]) 34 { 35 dis[v] = dis[u] + w[u][v]; 36 path[v] = u; 37 } 38 } 39 } 40 } 41 for (i = 0; i < n1; i++) 42 if (w[d][i] < fmax) path[i] = -1; 43 stack <int> q;//由于记录的中途节点是倒序的,所以使用栈(先进后出),获得正序 44 j = m1; 45 while (path[j] != -1) //如果j有中途节点 46 { 47 q.push(j); //将j压入堆 48 j = path[j]; //将j的前个中途节点赋给j 49 } 50 q.push(j); 51 midpath[0][0] = d; 52 while (!q.empty()) //先进后出,获得正序 53 { 54 midpath[0][l++] = q.top(); 55 q.pop(); //将堆的头节点弹出 56 } 57 for (i = 1; i < n1; i++) 58 if (midpath[0][i] != -1) 59 { 60 midsum[0] += w[midpath[0][i - 1]][midpath[0][i]]; 61 } 62 }
如代码所示,边的权值存储在w[i][j]里,源节点为d,终节点为m1,运用典型的dijkstra算法得出最短路径和,并用“”最后一跳“”方法得出最短路径的经过节点值,关于最后一跳算法必定能得到最短路径经过的证明方法为:
最后一跳与终结点必定是直接相连的,也就是加上一个固定的w[][]值,那么就必须要求最后一跳这个点也达到“”“最短路径”“”,因此可以得证。
原文地址:https://www.cnblogs.com/ljy1227476113/p/10654427.html
时间: 2024-10-20 16:25:12