最短路径之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


相关文章
|
2月前
|
存储 人工智能 算法
数据结构与算法细节篇之最短路径问题:Dijkstra和Floyd算法详细描述,java语言实现。
这篇文章详细介绍了Dijkstra和Floyd算法,这两种算法分别用于解决单源和多源最短路径问题,并且提供了Java语言的实现代码。
96 3
数据结构与算法细节篇之最短路径问题:Dijkstra和Floyd算法详细描述,java语言实现。
|
2月前
|
存储 算法 程序员
迪杰斯特拉(Dijkstra)算法(C/C++)
迪杰斯特拉(Dijkstra)算法(C/C++)
|
4月前
|
算法 定位技术
路径规划算法 - 求解最短路径 - A*(A-Star)算法
路径规划算法 - 求解最短路径 - A*(A-Star)算法
151 1
|
4月前
|
机器学习/深度学习 算法 Java
算法设计(动态规划应用实验报告)实现基于贪婪技术思想的Prim算法、Dijkstra算法
这篇文章介绍了基于贪婪技术思想的Prim算法和Dijkstra算法,包括它们的伪代码描述、Java源代码实现、时间效率分析,并展示了算法的测试用例结果,使读者对贪婪技术及其应用有了更深入的理解。
算法设计(动态规划应用实验报告)实现基于贪婪技术思想的Prim算法、Dijkstra算法
|
4月前
|
自然语言处理 算法
HanLP — HMM隐马尔可夫模型 - 路径规划算法 - 求解最短路径 - 维特比(Viterbi)算法
HanLP — HMM隐马尔可夫模型 - 路径规划算法 - 求解最短路径 - 维特比(Viterbi)算法
67 0
HanLP — HMM隐马尔可夫模型 - 路径规划算法 - 求解最短路径 - 维特比(Viterbi)算法
|
4月前
|
算法
路径规划算法 - 求解最短路径 - Dijkstra(迪杰斯特拉)算法
路径规划算法 - 求解最短路径 - Dijkstra(迪杰斯特拉)算法
108 0
|
4天前
|
机器学习/深度学习 算法
基于改进遗传优化的BP神经网络金融序列预测算法matlab仿真
本项目基于改进遗传优化的BP神经网络进行金融序列预测,使用MATLAB2022A实现。通过对比BP神经网络、遗传优化BP神经网络及改进遗传优化BP神经网络,展示了三者的误差和预测曲线差异。核心程序结合遗传算法(GA)与BP神经网络,利用GA优化BP网络的初始权重和阈值,提高预测精度。GA通过选择、交叉、变异操作迭代优化,防止局部收敛,增强模型对金融市场复杂性和不确定性的适应能力。
116 80
|
1天前
|
机器学习/深度学习 算法 索引
单目标问题的烟花优化算法求解matlab仿真,对比PSO和GA
本项目使用FW烟花优化算法求解单目标问题,并在MATLAB2022A中实现仿真,对比PSO和GA的性能。核心代码展示了适应度计算、火花生成及位置约束等关键步骤。最终通过收敛曲线对比三种算法的优化效果。烟花优化算法模拟烟花爆炸过程,探索搜索空间,寻找全局最优解,适用于复杂非线性问题。PSO和GA则分别适合快速收敛和大解空间的问题。参数调整和算法特性分析显示了各自的优势与局限。
|
23天前
|
算法
基于WOA算法的SVDD参数寻优matlab仿真
该程序利用鲸鱼优化算法(WOA)对支持向量数据描述(SVDD)模型的参数进行优化,以提高数据分类的准确性。通过MATLAB2022A实现,展示了不同信噪比(SNR)下模型的分类误差。WOA通过模拟鲸鱼捕食行为,动态调整SVDD参数,如惩罚因子C和核函数参数γ,以寻找最优参数组合,增强模型的鲁棒性和泛化能力。
|
9天前
|
供应链 算法 调度
排队算法的matlab仿真,带GUI界面
该程序使用MATLAB 2022A版本实现排队算法的仿真,并带有GUI界面。程序支持单队列单服务台、单队列多服务台和多队列多服务台三种排队方式。核心函数`func_mms2`通过模拟到达时间和服务时间,计算阻塞率和利用率。排队论研究系统中顾客和服务台的交互行为,广泛应用于通信网络、生产调度和服务行业等领域,旨在优化系统性能,减少等待时间,提高资源利用率。

热门文章

最新文章