Dijkstra算法,并记录最短路径

本文介绍如何使用一维数组高效存储从起点到其余所有点的最短路径信息,通过记录每条路径的最后一个中间节点,实现路径的快速查找与更新。详细解析Dijkstra算法的实现过程,包括邻接矩阵的初始化、最短路径的计算及路径更新策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

//看代码时需要提前理解的
//我们用一个一维数组怎么存储起点到其余所有点的多条最短路径
//我们只需要记录起点s到某个节点N的最短路径的最后一个中间节点K
//找到K后在找到s到K的最短路径的最后一个中间节点L,如此反复就可以找到路径
//所以一条路径只要记录一个点,一个一维数组就可以搞定了
#include<iostream>
#include<vector>
#define Max 100000
using namespace std;
void dijkstra(vector<vector<int>> &arcs,//邻接矩阵 矩阵在函数外按算法初始化 邻接矩阵应该是对称的
              vector<int> &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的储存最短路径方式你才能知道怎么找

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

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值