最短路径之Dijkstra算法

简介: 最短路径之Dijkstra算法

Dijkstra算法有些类似于最小生成树中prim算法,从源点出发,每次选出一个最短路径,然后依次更新n次。

下面是代码实现


#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
const int maxv=101;
const int inf=10000000;
struct node{
  int v,weight;
};
vector<node>Adj[maxv] ;
bool vis[101];//标记 
int dis[101];//记录最短距离 
int pre[101];//记录路径 
//dijkstra算法
void dijkstra (int n) {
  fill(vis,vis+n,false);
  fill(dis,dis+n,inf); //初始化dis和vis
  for(int i=0;i<n;i++) 
  pre[i]=i;  //路径初始化 
  dis[0] =0;//这里求零点到各点最短距离
  for(int i=0;i<n;i++) //循环n次
  {    
      int min=inf,u=-1;
    for(int j=0;j<n;j++) 
     //找最短距离点 ,这里可以用优先队列存储dis下标更快 
    {
      if(!vis[j]&&dis[j]<min)
      {
        u=j;
        min=dis[j];
      }
    }
    if(u==-1) return ;//没有找到 
    vis[u] =true;//标记已经找到的u 
    for(int j=0;j<Adj[u].size();j++) //更新dis 
    {
      int x=Adj[u][j].v;
      if(!vis[x]&&dis[u]+Adj[u][j].weight<dis[x])
      {dis[x]=dis[u]+Adj[u][j].weight;
      pre[x]=u;//到达x的前一个端点是u 
    }
  //遇到一些问题此处可以加第二条件,比如边权、点权、多少条最短路径等 
  } 
} 
}
 void dfs(int s,int n){//输出路径 
  if(pre[n]==s)
  {
    printf("%d ",s);
    return;
   }
  dfs(s,pre[n]);
  printf("%d ",n);
 }
int main(){
  return 0;
}

实际上,上面的程序只储存了一条路径,如果可能有多条路径并要求都打印出来怎么办?

这时将pre变成vector<int>型自然就可以存放多条路径,然后在dfs里面递归输出即可。

那么问题又来了,如果两条路径相同时,叫你选择出花费最少、字典序最小、点权和最大等一些条件怎么办?

有两个思路:

1.前面提到dfs里面可以输出多条路径,不如在遍历这些路径的时候,记录下符号其他条件的路径,保持更新即可,这是Dijkstra+dfs算法的解决思路。

2.也可以直接在执行Dijkstra过程中解决,其有一个更新dis的操作,在更新这个操作的时候我们可以同时也更新花费、点权和等其他条件

前者具有通用性,特别是一定要输出路径时,推荐使用前者,如果只是要一个值,后者比较简洁,下面两种方法的应用:

Dijkstra+Dfs+邻接表:

https://blog.csdn.net/qq_36684096/article/details/104728599


Dijkstra+邻接矩阵+第二指标:

https://blog.csdn.net/qq_36684096/article/details/104728264


相关文章
|
1月前
|
存储 人工智能 算法
数据结构与算法细节篇之最短路径问题:Dijkstra和Floyd算法详细描述,java语言实现。
这篇文章详细介绍了Dijkstra和Floyd算法,这两种算法分别用于解决单源和多源最短路径问题,并且提供了Java语言的实现代码。
70 3
数据结构与算法细节篇之最短路径问题:Dijkstra和Floyd算法详细描述,java语言实现。
|
1月前
|
存储 算法 程序员
迪杰斯特拉(Dijkstra)算法(C/C++)
迪杰斯特拉(Dijkstra)算法(C/C++)
|
3月前
|
机器学习/深度学习 算法 Java
算法设计(动态规划应用实验报告)实现基于贪婪技术思想的Prim算法、Dijkstra算法
这篇文章介绍了基于贪婪技术思想的Prim算法和Dijkstra算法,包括它们的伪代码描述、Java源代码实现、时间效率分析,并展示了算法的测试用例结果,使读者对贪婪技术及其应用有了更深入的理解。
算法设计(动态规划应用实验报告)实现基于贪婪技术思想的Prim算法、Dijkstra算法
|
3月前
|
自然语言处理 算法
HanLP — HMM隐马尔可夫模型 - 路径规划算法 - 求解最短路径 - 维特比(Viterbi)算法
HanLP — HMM隐马尔可夫模型 - 路径规划算法 - 求解最短路径 - 维特比(Viterbi)算法
58 0
HanLP — HMM隐马尔可夫模型 - 路径规划算法 - 求解最短路径 - 维特比(Viterbi)算法
|
3月前
|
算法 定位技术
路径规划算法 - 求解最短路径 - A*(A-Star)算法
路径规划算法 - 求解最短路径 - A*(A-Star)算法
81 0
|
3月前
|
算法
路径规划算法 - 求解最短路径 - Dijkstra(迪杰斯特拉)算法
路径规划算法 - 求解最短路径 - Dijkstra(迪杰斯特拉)算法
66 0
|
29天前
|
算法 安全 数据安全/隐私保护
基于game-based算法的动态频谱访问matlab仿真
本算法展示了在认知无线电网络中,通过游戏理论优化动态频谱访问,提高频谱利用率和物理层安全性。程序运行效果包括负载因子、传输功率、信噪比对用户效用和保密率的影响分析。软件版本:Matlab 2022a。完整代码包含详细中文注释和操作视频。
|
6天前
|
算法 数据安全/隐私保护 索引
OFDM系统PAPR算法的MATLAB仿真,对比SLM,PTS以及CAF,对比不同傅里叶变换长度
本项目展示了在MATLAB 2022a环境下,通过选择映射(SLM)与相位截断星座图(PTS)技术有效降低OFDM系统中PAPR的算法实现。包括无水印的算法运行效果预览、核心程序及详尽的中文注释,附带操作步骤视频,适合研究与教学使用。
|
14天前
|
算法 数据挖掘 数据安全/隐私保护
基于FCM模糊聚类算法的图像分割matlab仿真
本项目展示了基于模糊C均值(FCM)算法的图像分割技术。算法运行效果良好,无水印。使用MATLAB 2022a开发,提供完整代码及中文注释,附带操作步骤视频。FCM算法通过隶属度矩阵和聚类中心矩阵实现图像分割,适用于灰度和彩色图像,广泛应用于医学影像、遥感图像等领域。
|
15天前
|
算法 调度
基于遗传模拟退火混合优化算法的车间作业最优调度matlab仿真,输出甘特图
车间作业调度问题(JSSP)通过遗传算法(GA)和模拟退火算法(SA)优化多个作业在并行工作中心上的加工顺序和时间,以最小化总完成时间和机器闲置时间。MATLAB2022a版本运行测试,展示了有效性和可行性。核心程序采用作业列表表示法,结合遗传操作和模拟退火过程,提高算法性能。
下一篇
无影云桌面