【题解】求一个无向图的最短路径(dijkstra)

本文介绍了如何使用Dijkstra算法解决无向图中两点间的最短路径问题。通过举例说明输入和输出格式,并分析了算法的原理和适用条件,指出Dijkstra算法仅适用于边权为正数的图。还提到了使用优先队列优化算法效率的可能性。
摘要由CSDN通过智能技术生成

题目描述

  一个含n个结点的无向图,以矩阵存储方式给出,请求出指定的两个点之间的最短距离。

输入格式:

  第一行,一个整数n(0 < n < 1000 ),表示无向图中结点的个数。
  接下来是一个n*n的矩阵,表示无向图中各结点之间的联结情况,矩阵中的数值为小于等于1000的下整数,其中 0 表示两点之间无直接连接。
  最后一行,两个整数i,j。表示求解i点到j点的最短距离。

输出格式:

  一个数值,表示指定的两点之间最短距离。

输入样例#1:

2
0 2
2 0
1 2

输出样例#1:

2

【解题分析】

这是比较直白的一个单源点最短路问题,使用dijkstra算法,给每个节点设置标号,dis[i]表示从源点到第i个点的最短路的值,每次从还没标记的点里面找一个最小的dis值,将它标记掉(即确认该点的dis为它最短路),然后将这个点的所有有关联的点的dis进行更新,直到全部点处理完成。过程有点像贪心,每次取最小dis的值,但是需要不断的利用最新确定的点的dis值去更新其他点的dis值,对于所有边都是大于0的情况,这是必然可行的,这个更新的过程本质上是个DP的过程。

如果边权有负数呢?这个正确性就无法保证了,所以dijkstra算法只对正权边图有效。

进一步的,改算法的过程具有贪心性,每次取最小的dis,我们可以使用优先队

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值