Dijkstra算法,并记录最短路径

//看代码时需要提前理解的
//我们用一个一维数组怎么存储起点到其余所有点的多条最短路径
//我们只需要记录起点s到某个节点N的最短路径的最后一个中间节点K
//找到K后在找到s到K的最短路径的最后一个中间节点L,如此反复就可以找到路径
//所以一条路径只要记录一个点,一个一维数组就可以搞定了
#include
#include
#define Max 100000
using namespace std;
void dijkstra(vector> &arcs,//邻接矩阵 矩阵在函数外按算法初始化 邻接矩阵应该是对称的
              vector &dist,//存储最短路径的,初始化为-1,长度为节点个数
              int start//这是起点,所有起点0开始编号,100个起点就是0-99,
                     //arcs[i]就是第i个起点到各个相邻,注意只是给了相邻起点的距离,arcs[i][i]==0
              )
{
  
  int nm_length = arcs.size();//得到邻接矩阵的边长 
   //这里的代码应该是做邻接矩阵、参数是否符合要求的
  {
    //我就省略了
  }
  //定义bool数组 标志该节点是否走过 并初始化为false
  bool *cover_node=new bool[nm_length];
  for (int i = 0; i < nm_length; i++)
    cover_node[i] = false;
  //dist数组是储存路径的 并初始化为-1
  //int *dist = new int[nm_length];
  for (int i = 0; i < nm_length; i++)
  {
    dist[i] = -1;
  }
  //开始不断找距离源点start最近的点距离
  while(true)
  {
    int min = Max; int min_index = start;
    for (int i_temp = 0; i_temp < nm_length; i_temp++)
    {
      if (i_temp != start&& !cover_node[i_temp])//不需要源点自身的比较并且不能是走过的节点
      {
        if (arcs[start][i_temp] < min)
        {
          min = arcs[start][i_temp];
          min_index = i_temp;
        }
      }
    }
    //已经找到最小点了,如果发现min=Max,可以退出 因为所有点都走过了
    if (min == Max)
      break;
     
    //如果找到最小节点发现为-1,证明他是由start直接走到的,则他最短路径的最后一个节点就是start
    if (dist[min_index] == -1)
      dist[min_index] = start;
    //找到最小节点后要更新邻接矩阵
    for (int i_temp1 = 0; i_temp1 < nm_length; i_temp1++)
    {
      if (arcs[start][min_index] + arcs[min_index][i_temp1] < arcs[start][i_temp1])
      {
        arcs[start][i_temp1] = arcs[start][min_index] + arcs[min_index][i_temp1];
        dist[i_temp1] = min_index;//这一步路径的更新意味着到达i_temp1的最短路径最后一个点是min_index
      }
    }
    //走过后要把最小点要标记为true
    cover_node[min_index] = true;
  }

//最后arcs[start]一行就是到各点最短路径

//根据dist就能找到最短路径,当然这里要你理解dist的储存最短路径方式你才能知道怎么找

//如果还不理解就自己再看多几次,拿笔画画

}

你可能感兴趣的:(Dijkstra算法,并记录最短路径)