最短路----Dijkstra算法详解

ops/2024/12/16 22:03:54/

简介

迪杰斯特拉(Dijkstra)算法是一种用于在加权图中找到单个源点到所有其他顶点的最短路径的算法。它是由荷兰计算机科学家艾兹格·迪科斯彻(Edsger Dijkstra)在1956年提出的。Dijkstra算法适用于处理带有非负权重的图。迪杰斯特拉算法主要特点是从起始点开始,采用贪心算法,每次遍历到始点距离最近且未访问过的顶点的邻接节点,直到扩展到终点为止。适用的是单源路径最短路问题,对于多源则采用弗洛伊德(Floyd)算法

Dijkstra算法原理

  1. 初始化

    • 创建一个距离数组dist,用来存储从起始节点到每个节点的最短距离,初始时将起始节点的距离设为0,其余节点设为无穷大。
    • 创建一个优先队列(通常使用最小堆)来存储待处理的节点,初始时将起始节点加入队列。
  2. 处理节点

    • 从优先队列中取出距离最小的节点,标记为已处理。
    • 对于该节点的每个邻接节点,计算从起始节点到该邻接节点的距离。如果这个距离小于当前记录的距离,则更新距离并将该邻接节点加入优先队列。
  3. 重复

    • 重复步骤2,直到优先队列为空,或者所有节点都被处理。

如果还看不明白,请看下图

举个栗子
示例图
 
图的邻接表表示
  • 节点0到节点1的边权重为1
  • 节点0到节点2的边权重为4
  • 节点1到节点2的边权重为2
  • 节点1到节点3的边权重为5
  • 节点2到节点4的边权重为1
  • 节点4到节点3的边权重为1
Dijkstra算法执行过程

假设我们从节点0开始,以下是distvisited数组在每一步的变化:

  1. 初始化

    • dist = [0, ∞, ∞, ∞, ∞] (从起始节点0到其他节点的距离)
    • visited = [false, false, false, false, false] (所有节点未被访问)
  2. 处理节点0

    • 当前节点:0
    • 更新邻接节点1和2:
      • dist[1] = 1(0到1的距离)
      • dist[2] = 4(0到2的距离)
    • 更新后的数组:
      • dist = [0, 1, 4, ∞, ∞]
      • visited = [true, false, false, false, false]
  3. 处理节点1(下一个最小距离的节点):

    • 当前节点:1
    • 更新邻接节点2和3:
      • dist[2] = min(4, 1 + 2) = 3(更新0到2的距离)
      • dist[3] = 1 + 5 = 6(更新0到3的距离)
    • 更新后的数组:
      • dist = [0, 1, 3, 6, ∞]
      • visited = [true, true, false, false, false]
  4. 处理节点2

    • 当前节点:2
    • 更新邻接节点4:
      • dist[4] = min(∞, 3 + 1) = 4(更新0到4的距离)
    • 更新后的数组:
      • dist = [0, 1, 3, 6, 4]
      • visited = [true, true, true, false, false]
  5. 处理节点4

    • 当前节点:4
    • 更新邻接节点3:
      • dist[3] = min(6, 4 + 1) = 5(更新0到3的距离)
    • 更新后的数组:
      • dist = [0, 1, 3, 5, 4]
      • visited = [true, true, true, false, true]
  6. 处理节点3

    • 当前节点:3
    • 由于3没有未访问的邻接节点,算法结束。
    • 最终的dist数组为:
      • dist = [0, 1, 3, 5, 4](从节点0到各个节点的最短距离)
    • visited数组为:
      • visited = [true, true, true, true, true](所有节点均已访问)
最终结果
  • 从节点0到节点1的最短距离是1
  • 从节点0到节点2的最短距离是3
  • 从节点0到节点3的最短距离是5
  • 从节点0到节点4的最短距离是4

这个过程展示了Dijkstra算法如何逐步更新每个节点的最短路径,并标记已访问的节点。

代码实现

#include<iostream>
using namespace std;
int n,e,s;//n个顶点,e条边,s是起点
int dis[101];//dis[i]起点到i的最短距离
int vis[101];//标记是否找到
int edge[101][101];//记录路径i->j有路径
int main()
{cin>>n>>e;for(int i=1;i<=n;i++){dis[i]=100000;}for(int i=1;i<=e;i++){//邻接矩阵存储int a,b,c;cin>>a>>b>>c;edge[a][b]=c;}cin>>s;dis[s]=0;//起点到起点不需要代价for(int i=1;i<=n;i++){int minn=inf,minx;for(int j=1;j<=n;j++){if(dis[j]<minn&&vis[j]==0){//寻找此点到其他点的最小距离minn=dis[j];minx=j;}}vis[minx]=1;//标记到达的最小点for(int j=1;j<=n;j++){if(edge[minx][j]>0)//有边的话 {if(minn+edge[minx][j]<dis[j]){dis[j]=minn+edge[minx][j];//更新以最小距离点最为中转点的最小距离}}}}for(int i=1;i<=n;i++){//打印最短距离cout<<dis[i]<<" ";}return 0;
}


http://www.ppmy.cn/ops/142472.html

相关文章

Git 命令大全:全面掌握版本控制系统

一、引言 Git 是一款广泛使用的分布式版本控制系统&#xff0c;它在软件开发、项目协作以及代码管理等方面发挥着极为重要的作用。无论是个人开发者独自管理代码库&#xff0c;还是大型团队协同开发复杂项目&#xff0c;Git 都提供了强大而灵活的功能来满足各种需求。通过掌握…

服务器一般装什么系统?

在服务器管理中&#xff0c;操作系统的选择是一个关键因素&#xff0c;它直接影响到服务器的稳定性、性能和可维护性。那么为什么有些服务器选择Linux&#xff0c;而不是Windows&#xff1f;选择合适的操作系统对服务器的性能和安全性有多么重要&#xff1f; 在众多操作系统中…

网络编程之初识网络

1.IP地址 IP地址实际上全称是&#xff08;互联网协议地址&#xff09;&#xff0c;是每一台计算机在网络上面的编号&#xff0c;每个连接Internet 的设备&#xff08;如计算机、路由器、服务器等&#xff09;都被分配一个唯一的 IP 地址&#xff0c;简单来说&#xff0c;IP地址…

Linux下禁止root远程登录访问

开始讲故事 Long long ago&#xff0c; Linux远程访问方式有telnet、ssh两种协议&#xff1b;有人可能还会说vnc和rdp协议方式&#xff0c;后面这两种主要是可视化桌面场景下的&#xff0c;并非主流。 时过境迁&#xff0c;telnet因安全性低逐渐被禁用淘汰&#xff0c;最后就…

前端报错npm ERR cb() never called问题

环境使用node版本v14.21.3&#xff0c;npm版本6.14.18 1.问题描述 1.1使用npm install后报错 npm ERR! cb() never called!npm ERR! This is an error with npm itself. Please report this error at: npm ERR! ? ? <https://npm.community>npm ERR! A complete log…

scala列表

1 不可变 List 说明 &#xff08;1&#xff09;List 默认为不可变集合 &#xff08;2&#xff09;创建一个 List&#xff08;数据有顺序&#xff0c;可重复&#xff09; &#xff08;3&#xff09;遍历 List &#xff08;4&#xff09;List 增加数据 &#xff08;5&#…

【跨库查询、多库查询】.NET开源 ORM 框架 SqlSugar 系列

文章目录 一、跨库方式1&#xff1a;跨库导航二、手动跨库查询三、同服务器&#xff1a;自动查询跨库查询3.1 Mysql和SqlServer自动3.2 自动: PgSql跨Scheme查询3.3 其他库同服务器 四、跨服务器&#xff1a;自动跨库查询4.1 配置SqlServer dblink4.2 配置 Oracle dblink4.3 配…

BGP-面试

简单介绍一下BGP BGP&#xff0c;边界网关协议&#xff0c;属于路径矢量路由协议。属于触发式更新或者增量更新。具有丰富的路由策略&#xff0c;能够灵活的进行路由选择。重心不是在路由学习&#xff0c;而是路由优选、更高效的传递路由和维护大量的路由信息。基于TCP&#xf…