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

相關文章
相關標籤/搜索