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

  • 相关阅读:
    WindowsServer2003SP2EnterpriseEdition激活码
    2016/12/14渗透学习总结
    技术之路注定孤独
    几道office题的总结
    一路走来,只是清风
    【IIS】IIS中同时满足集成模式和经典模式
    IntelliJ IDEA如何build path
    kafka的集群安装
    尚硅谷 kafka
    队列
  • 原文地址:https://www.cnblogs.com/ljy1227476113/p/10654427.html
Copyright © 2011-2022 走看看