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[][]值,那么就必须要求最后一跳这个点也达到“”“最短路径”“”,因此可以得证。

猜你喜欢

转载自www.cnblogs.com/ljy1227476113/p/10654427.html