c++实现最短路径算法(Dijkstra算法)

article/2025/8/25 2:53:39

0简介

Dijkstra算法是一种计算某一顶点到其余顶点最短路径的算法。它采用了贪心的策略,实现时使用了广度优先。这个算法常学常忘,因此写篇博客彻底解决它。

1计算步骤介绍

Dijkstra的计算步骤不难,如下

(1)设置一个集合表示已经标记过的节点,初始化为空
(2)使用一个数组d记录所有节点与源节点s的距离,初始化d[s] = 0,其余设置为INF
(3)循环n次
{在未标记的节点中,选出d值最小的节点x;将x加入标记过节点的集合;对于从x出发的所有边(x,y),更新d[y] = min(d[y],d[x]+w(x,y))
}

这个原理并不难,相信读者对照图论教科书多练习几遍即可手算,下面我们结合Leetcode上一道具体的题目来实现一下。

2 代码实战

下面是Leetcode743题的题干。这道题是Dijkstra算法一个典型应用,题目不难,使用Dijkstra算法计算出源节点到剩余节点的最小距离即可。最后返回到节点的最大值,如果这个图不是一个联通图,返回-1。

有 N 个网络节点,标记为 1 到 N。
给定一个列表 times,表示信号经过有向边的传递时间。 times[i] = (u, v, w),其中 u 是源节点,v 是目标节点, w 是一个信号从源节点传递到目标节点的时间。
现在,我们从某个节点 K 发出一个信号。需要多久才能使所有节点都收到信号?如果不能使所有节点收到信号,返回 -1。
输入:times = [[2,1,1],[2,3,1],[3,4,1]], N = 4, K = 2
输出:2
在这里插入图片描述

对于实现Dijkstra算法来说,解决问题的首要问题是建立图。建图我们采用邻接表的方式,对于每一个点,所连接的点与权值。而在实现的时候呢,我们将它抽象为一个边(edge),使用一个结构体Edge,其中u、v、d依次是源节点、目的节点、权值。

    struct Edge{int u,v,d;Edge(int from,int to,int dis):      u(from),v(to),d(dis){}};

所以建图时,我们使用一个vector<Edge> edges记录边,使用邻接表建图时只需记录源节点所在边在edges的下标就足够了。
建图完毕之后使用BFS实现原理部分的计算步骤即可,有一点值得注意的是计算步骤有一个步骤是在未标记的节点中,选出d值最小的节点x;对于这个步骤,我们可以使用一个优先队列优化一下,u是待标记的节点,d是与源节点的距离。这里重载了<使它在优先队列中升序排列。

    struct heapNode{int u,d;bool operator < (const heapNode& rhs) const{return d > rhs.d;}};

下面来看一下全部代码

class Solution {
public:struct Edge{int u,v,d;Edge(int from,int to,int dis):      u(from),v(to),d(dis){}};struct heapNode{int u,d;bool operator < (const heapNode& rhs) const{return d > rhs.d;}};int networkDelayTime(vector<vector<int>>& times, int N, int K) {priority_queue<heapNode> que;vector<Edge> edges;vector<vector<int>> g(N,vector<int>());vector<int> d(N,INT_MAX);d[K-1] = 0;vector<int> visited(N,0);for(int i = 0; i < times.size();++i)//建图{edges.push_back(Edge{times[i][0]-1,times[i][1]-1,times[i][2]});g[times[i][0]-1].push_back(edges.size()-1);}que.push(heapNode{K-1,0});//先把源节点加进去while(!que.empty()){heapNode node = que.top();que.pop();if(visited[node.u])continue;visited[node.u] = 1;//标记for(int i = 0; i < g[node.u].size(); ++i){Edge &edge = edges[g[node.u][i]];if(d[edge.v] > d[edge.u] + edge.d)//更新权值{d[edge.v] = d[edge.u] + edge.d;que.push(heapNode{edge.v,d[edge.v]});}}}int result = -1;for(int i = 0; i < d.size(); ++i){if(d[i] > result)result = d[i];}return result == INT_MAX ? -1 : result;//判断是否是连通图}
};

http://chatgpt.dhexx.cn/article/TyvUdbe6.shtml

相关文章

最短路径算法——dijkstra

dijkstra 前提&#xff1a;在一张图里&#xff0c;不能有权值为负数的边。 给你一个出发点&#xff0c;求出发点到所有结点的最短距离是多少&#xff1f;如果无法到达某个点&#xff0c;则到这个点的距离是正无穷&#xff08;一般出现在有向图里面&#xff09;。 举个&#…

最短路径算法详解

前言&#xff1a; 最短路径算法&#xff1a;用于计算一个节点到其他所有节点的最短路径。主要特点是以起始点为中心向外层层扩展&#xff0c;直到扩展到终点为止。 例子&#xff1a; 暑期&#xff0c;你想要出门去旅游&#xff0c;但是在你出发之前&#xff0c;你想知道任意…

基于java最短路径算法的简单实现

一、我们先画一个可达路径图表&#xff1a; -1表示不可直达&#xff0c;0表示自己&#xff0c;其他整数表示长度或者权重 ABCDA012-1B-1015C-1-101D-1-1-10 用图形可表示为&#xff1a; 二、算法思路 1、先列出所有保存所有节点到可达节点的路径二维表 2、逐步寻找从起始节点到…

最短路径算法及应用

乘汽车旅行的人总希望找出到目的地的尽可能的短的行程。如果有一张地图并在图上标出每对十字路口之间的距离&#xff0c;如何找出这一最短行程&#xff1f;  一种可能的方法就是枚举出所有路径&#xff0c;并计算出每条路径的长度&#xff0c;然后选择最短的一条。那么我们很…

关于最短路径算法的理解

“最短路径算法:Dijkstra算法&#xff0c;Bellman-Ford算法&#xff0c;Floyd算法和SPFA算法等。​从某顶点出发&#xff0c;沿图的边到达另一顶点所经过的路径中&#xff0c;各边上权值之和最小的一条路径叫做最短路径。” 我们解决最短路径问题&#xff0c;常用的是Dijkstra…

最短路径算法-----Dijkstra迪杰斯特拉算法

最近巩固一下算法&#xff0c;提高自己内力&#xff0c;网上看到查看到这篇介绍很详细的《Dijkstra迪杰斯特拉算法》&#xff0c;在这里转载记录一下。 1 前言 本章介绍迪杰斯特拉算法。和以往一样&#xff0c;本文会先对迪杰斯特拉算法的理论论知识进行介绍&#xff0c;然后给…

Dijkstra 最短路径算法 Python 实现

原文链接 问题描述 使用 Dijkstra 算法求图中的任意顶点到其它顶点的最短路径&#xff08;求出需要经过那些点以及最短距离&#xff09;。 以下图为例&#xff1a; 算法思想 可以使用二维数组来存储顶点之间边的关系 首先需要用一个一维数组 dis 来存储 初始顶点到其余各个顶…

神经网络最短路径算法,最短路径算法的原理

节约里程法求解最短路问题 你只要记住2点之间直线最短。节约里程法是用来解决运输车辆数目不确定的问题的最有名的启发式算法。1、节约里程法优化过程分为并行方式和串行方式两种。 核心思想是依次将运输问题中的两个回路合并为一个回路&#xff0c;每次使合并后的总运输距离…

最短路径算法及Python实现

最短路径问题 在图论中&#xff0c;最短路径问题是指在一个有向或无向的加权图中找到从一个起点到一个终点的最短路径。这个问题是计算机科学中的一个经典问题&#xff0c;也是许多实际问题的基础&#xff0c;例如路线规划、通信网络设计和交通流量优化等。在这个问题中&#…

图论:图的四种最短路径算法

目录&#xff1a; 1.DFS&#xff08;单源最短路径算法&#xff09; 例题1&#xff1a; DFS题目分析&#xff1a; 代码DFS&#xff1a; 2.Floyed&#xff08;时间复杂度On^3&#xff09; 1.应用场景&#xff1a; 2.解析算法&#xff1a; 核心代码1&#xff1a; 我的笔…

图的五种最短路径算法

本文总结了图的几种最短路径算法的实现:深度或广度优先搜索算法,费罗伊德算法,迪杰斯特拉算法,Bellman-Ford 算法。 1)深度或广度优先搜索算法(解决单源最短路径) 从起点开始访问所有深度遍历路径或广度优先路径,则到达终点节点的路径有多条,取其中路径权值最短的一…

最短路径算法——Dijkstra算法——python3实现

本文参考来自数据结构与算法分析 java语言描述。 文章目录 问题描述问题分析实现过程如何使用数据变化表代码实现优先队列中的堆排序使用set代替优先队列得到最短路径 负权边算法改进&#xff08;若为无圈图&#xff09; 问题描述 现有一个有向赋权图。如下图所示&#xff1a;…

最短路径算法的编程与实现 C语言

一 、目的&#xff1a; 1.掌握最短路径算法的基本原理及编程实现&#xff1b; 二 、环境&#xff1a; operating system version&#xff1a;Win11 CPU instruction set: x64 Integrated Development Environment&#xff1a;Viusal Studio 2022 三 、内容&#xff1a; 1…

图的四种最短路径算法

本文总结了图的几种最短路径算法的实现&#xff1a;深度或广度优先搜索算法&#xff0c;弗洛伊德算法&#xff0c;迪杰斯特拉算法&#xff0c;Bellman-Ford算法 1&#xff09;&#xff0c;深度或广度优先搜索算法&#xff08;解决单源最短路径&#xff09; 从起始结点开始访问所…

算法之几个常见的经典最短路径算法

目录 1. Dijkstra算法2. Floyd算法3. Bellman-Ford 算法 1. Dijkstra算法 是解单源最短路径问题的贪心算法。 有一向带权图 G (V, E)&#xff0c;包含右n个顶点&#xff0c;其中每条边的权是非负实数&#xff0c;定义数组 dist 为原点到G中各个顶点的距离&#xff0c;初始化为…

最短路径的四种算法

最短路径四种算法 1234FloydDijkstraBellman-Ford队列优化的Bellman-Ford 一&#xff0c;只有四行的算法——Floyd-Warshall 假设求顶点 V i Vi Vi到 V j Vj Vj的最短路径。弗洛伊德算法依次找从 V i Vi Vi到 V j Vj Vj&#xff0c;中间经过结点序号不大于 0 0 0的最短路径&…

最短路径算法

1.最短路径算法分为单源最短路径算法和多源最短路径算法 &#xff08;a&#xff09;单源最短路径算法&#xff0c;可以计算出从起点到任意一个起点的最短路径。 例如&#xff1a;Dijkstra算法 &#xff0c;SPFA算法 &#xff08;b&#xff09;多源最短路径算法&#xff0c;可…

哈夫曼树及其应用

1、哈夫曼树的基本概念 ---- 哈夫曼&#xff08;Huffman&#xff09;树又称作最优二叉树&#xff0c;它是n个带权叶子结点构成的所有二叉树中&#xff0c;带权路径长度最小的二叉树。 ---- “路径”就是从树中的一个结点到另一个结点之间的分支构成的部分&#xff0c;而分支…

哈夫曼树的C语言实现

什么是哈夫曼树 当用 n 个结点&#xff08;都做叶子结点且都有各自的权值&#xff09;试图构建一棵树时&#xff0c;如果构建的这棵树的带权路径长度最小&#xff0c;称这棵树为“最优二叉树”&#xff0c;有时也叫“赫夫曼树”或者“哈夫曼树”。 在构建哈弗曼树时&#xff0…

哈夫曼树的构建及编码

哈夫曼树的构建及编码 文章目录 哈夫曼树的构建及编码一、什么是哈夫曼树二、什么是哈夫曼编码三、怎么建哈夫曼树、求哈夫曼编码四、为什么哈夫曼编码能实现压缩 声明&#xff1a;关于文件压缩&#xff0c;不是本文的重点&#xff0c;本文只说明并讨论哈夫曼树的构建和编码&am…