Dijkstra(迪杰斯特拉)算法:求给定顶点到其余各顶点的最短路径

算法特点:该算法使用广度优先搜索解决了赋权有向图或者无向图的单源点最短路径问题。(求给定顶点到其余各点的最短路径问题)
算法思路:Dijkstra算法采用的是一种贪心的策略,声明一个数组dis来保存源点到各个顶点的最短距离和一个保存已经找到了最短路径的顶点的集合:T,初始时,原点 s 的路径权重被赋为 0 (dis[s] = 0)。若对于顶点 s 存在能直接到达的边(s,m),则把dis[m]设为w(s, m),同时把所有其他(s不能直接到达的)顶点的路径长度设为无穷大。初始时,集合T只有顶点s。
然后,从dis数组选择最小值,则该值就是源点s到该值对应的顶点的最短路径,并且把该点加入到T中,OK,此时完成一个顶点,
然后,我们需要看看新加入的顶点是否可以到达其他顶点并且看看通过该顶点到达其他点的路径长度是否比源点直接到达短,如果是,那么就替换这些顶点在dis中的值。
然后,又从dis中找出最小值(记得是从还没找到最小值的点中查找的),重复上述动作,直到T中包含了图的所有顶点。
原文链接:https://blog.csdn.net/qq_35644234/article/details/60870719

下面看一道Leetcode原题:743:网络延迟时间
在这里插入图片描述

分析:从某个节点K发出信号,要使所有节点都能接收到信号,可通过求出K到其余每个节点的路径的最小值,即只要经过这些值中的最大值时间,所有节点便可以收到K节点发来的信号。eg上图:节点2到节点1花销为1、节点2到节点3花销为1,节点2到节点4花销为2,所以只需要花销为2,节点1、3、4即可收到来自节点2的信号。
下面是代码:

class Solution {
   
public:
    int networkDelayTime(vector<vector<int>>& times, int n, int k) {
   
    	// 若需要在本地编译器运行, times, n, k需要手动输入
        const
  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我可以回答这个问题。首先,让我们来解释一下带权无向和邻接矩阵。 带权无向是一个由若干个顶点和若干条边组成的,每条边都带有一个权值。邻接矩阵是一种常见的存储的方式,它用一个二维数组来表示中各个顶点之间的连接关系和边的权值,如果两个顶点之间有边相连,则对应的数组元素为该边的权值,否则为0或者无穷大。 Dijkstra算法是一种解决带权中单源最短路径的贪心算法。它的基本思想是从起点开始,每次选择当前距离起点最近的一个顶点,然后用该顶点更新与它相邻的顶点距离,最终得到起点到各个顶点最短路径。 接下来,我将按照您的要,回答您的问题。 假设我们有一个带权无向,用邻接矩阵表示如下: ``` A B C D E A 0 2 0 1 0 B 2 0 3 2 0 C 0 3 0 0 4 D 1 2 0 0 3 E 0 0 4 3 0 ``` 我们要顶点A到顶点E的最短路径。按照Dijkstra算法的步骤,我们可以依次计算出从A到其他顶点最短路径长度: 1. 初始化:将起点A加入到已访问的集合中,将A到其他顶点距离初始化为对应的邻接矩阵中的值。 ``` A B C D E A 0 2 0 1 0 B 2 0 3 2 0 C 0 3 0 0 4 D 1 2 0 0 3 E 0 0 4 3 0 已访问:{A} 距离:[0, 2, 0, 1, 0] ``` 2. 选择距离起点最近的顶点B,并更新与之相邻的顶点距离。 ``` A B C D E A 0 2 0 1 0 B 2 0 3 2 0 C 0 3 0 0 4 D 1 2 0 0 3 E 0 0 4 3 0 已访问:{A, B} 距离:[0, 2, 3, 1, 0] ``` 3. 选择距离起点最近的顶点D,并更新与之相邻的顶点距离。 ``` A B C D E A 0 2 0 1 0 B 2 0 3 2 0 C 0 3 0 0 4 D 1 2 0 0 3 E 0 0 4 3 0 已访问:{A, B, D} 距离:[0, 2, 3, 1, 4] ``` 4. 选择距离起点最近的顶点E,并更新与之相邻的顶点距离。 ``` A B C D E A 0 2 0 1 0 B 2 0 3 2 0 C 0 3 0 0 4 D 1 2 0 0 3 E 0 0 4 3 0 已访问:{A, B, D, E} 距离:[0, 2, 3, 1, 4] ``` 5. 最终得到从A到各个顶点最短路径长度,其中A到E的最短路径长度为4。我们可以根据记录的距离信息,回溯得到A到E的最短路径,即A->D->E。因此,按顺序输出该最短路径上的各顶点为A、D、E。 希望我的回答能够解决您的问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值