Dijkstra最优路径算法及具体C++实例实现

本文介绍了Dijkstra算法的基本原理和实现步骤,并给出了具体的C++代码实现。通过实例展示了如何使用Dijkstra算法求解有向图的最优路径,包括从源点A出发到达其他所有顶点的最短路径。
摘要由CSDN通过智能技术生成

一、实现的最终效果

  1. 从键盘中输入有向图:首先输入有向图中总共的结点数与边数,然后再输入每一条边的信息,输入格式如下:From:起点,Weight:边的权重, To:终点。

在这里插入图片描述
2. 打印输入有向图的结果:以邻接矩阵的形式打印出矩阵结果。在这里插入图片描述
3. 求解最优路径:
在这里插入图片描述

二、Dijkstra算法原理

原理

Dijkstra算法是一种根据路径长度的递增顺序,逐步求出最短路径的算法,其主要思想为:首先求得一条最短的路径,然后再根据该条最短路径求得次最短路径,如此循环上述操作,最终求得一顶点至其他所有点的最短路径。如:

在这里插入图片描述
由上图可知,由源点v出发的最短路径为v-v1,此时就可确定已最短路径为v-v1有最短路径的基础上,从v1出发,看是否通过v1到其他点的路径,若新得到的路径比原本v到vn的路径短,则用v-v1-vn代替v-vn的路径,在此轮更新完毕后,选出路径中新得到的最小路径做为次最小路径,如此循环,即得到v到其他所有顶点的最短路径。

流程

有向图如图所示:
在这里插入图片描述
寻找A到其他各点最短路径的步骤如下:
进行第一轮地筛选:
在这里插入图片描述
得到最第一轮中的最短路径为A-B的路径,路径长度为1,在A-B的路径基础上进行第二轮筛选:
由上可知,由B出发可有的相邻结点有:B-C(长度为4)、B-D(长度为2)、B-E(长度为5),得到几条新的路径:A-B-C(长度为5)、A-B-D(长度为3)、A-B-E(长度为6),因为A-B-C比A-C短,A-B-D比A-D短,A-B-E比A-E长,所以更新A到C的路径,更新A到D的路径,最终得到的第二轮筛选结果如下所示。

在这里插入图片描述在第二轮筛选的结果中,最短路径为A-E,所以,通过A-E进行第三轮筛选:由E出发相邻的结点有:E-D(长度为3)(因为A-B已经是最短的路径,所以此处不用再算E到B的路径),得到的新路径为:A-E-D(长度为6),因A-E-D比A-D长,所以不用更新任何路径,结果如下。

在这里插入图片描述
由第三轮筛选结果得,A-B-D是最短的路径,所以在此基础上进行第四轮筛选:D无任何相邻结点,所以更新后结果如下。

在这里插入图片描述
至此,通过Dijkstra算法求出A到其它顶点的最优路径过程完毕,各最优路径分别为:
A到B:A-B,长度为1;
A到C: A-B-C,长度为5;
A到D: A-B-D, 长度为3;
A到E: A-E,长度为3。

三、代码实现

有向图的类代码

class GraphMatrix{
   
  public~GraphMatrix();

    void createdGraph();
    void printGraph();

    void inputVertexNumber(); //输入有向图的结点数目
    void makeVertexArray();//生成装有结点的数组
    void inputEdgeNumber();//输入有向图的边的数目
    void inputEdgeInfo();//输入边的信息,格式为:起点 权重 终点
    void addEdgeToList(int vFrom, int weight, int vTo);//添加边到对应的邻接矩阵中
    int n();//返回有向图的结点总数
    int e();//返回有向图的边的总数
    int first(int v);//返回结点v的第一个相邻结点 
    int next(int v, int w);//返回结点v在相邻结点w后的第一个邻结点
  
  • 4
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值