dijkstra算法計算最短路徑和並輸出最短路徑


 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[][]值,那么就必須要求最后一跳這個點也達到“”“最短路徑”“”,因此可以得證。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM