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[][]值,那麼就必需要求最後一跳這個點也達到「」「最短路徑」「」,所以能夠得證。spa