求有向图的简单路径_ACM算法 | 最短路径Dijkstra

本文详细介绍了Dijkstra算法,用于解决有向图中单源最短路径问题。通过实例解析算法步骤,包括初始化路径为无穷大,设置源点为0,输入数据,逐步找到离源点最近的顶点并更新最短路径。最后,给出了两种解法,包括未优化和使用优先队列优化的时间复杂度分析。
摘要由CSDN通过智能技术生成

感谢ACM队员的无私分享,以下是内容正文:

(1)首先先解释一下单源最短路径:

    1)容易的解释:指定一个点(源点)到其余各个顶点的最短路径,也叫做“单源最短路径”

    2)官方解释:给定一个带权有向图G=(V,E),其中每条边的权是一个实数。另外,还给定V中的一个顶点,称为源。现在要计算从源到其他所有各顶点的最短路径长度。这里的长度就是指路上各边权之和。这个问题通常称为单源最短路径问题。

(2)解释一下Dijkstra算法:

 例如求A点到B、C、D、E、F顶点的最短路径;

 a1b0a3794c6bd7d86ca75274d879763c.png

我们可以先这样设想:

1)先把所有的点到另一个点的长度全部初始化为无穷大 ,本身到本身则初始化为0,再输入数值;

第一:将所有点到点初始化为无穷大

 da92c2478f0abcb074b0ae1e180a9203.png

代码大致如下:

const int INF = 0x3f3f3f3f; //为无穷大;int G[2000][2000];int N; //N为点的个数;for (i = 1; i <= N; i++){
      for (j = 1; j <= N; j++)  {
        G[i][j] = INF;  }}

第二:将本身到本身初始化为0 ;因为本身到本身的距离就为0;

99b7604b31e820ab0c45e9efdb5529fa.png

for (int i = 1; i <= N; i++){
      G[i][i] = 0; //本身到本身距离为0;}

第三:输入数据:

 82b3d4861e4ace6c49740cb22154bdb7.png

对应下面的表格:

 9038eaa2b8714ef23bf16c8b92aa5b55.png

代码实现大概如下:

int M;  //M为边的个数;int x, y; // x ,y 为同一边的两个点;int D;  //D 为题目给的边的权值;for (i = 1; i <= M; i++){
      cin >> x >> y >> D;  if (G[x][y] > D)  {
        G[x][y] = D;    G[y][x] = D;  }}//上面我们已经把点到其他点的距离初始化为无穷大,把本身到本身初始化为0;//那么上面这个循环的化,我们可以把题目给的两点之间的权值输入;//题目给的权值一定为正值,所以比0大,故本身到本身的距离还是维持为0;//而小于无穷大,所以用上面那个循环可把边的权值输入;

 2)我们还需用一个一维数组d来存储A顶点到其余各个顶点的初始路程

 213fce4d17be3bbbe9140051870033d1.png

下面我们来模拟一下:

这是输入最初数据的表格:

592f1875f458377bac2136d2f649319f.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值