Dijkstra算法的原理及GUI实现【QT】

源码链接: https://blog.csdn.net/qq_44394952/article/details/122587805.

1.课程设计要求

1)输入必要参数,包括:结点个数、节点间路径长度、给定节点;
2)输出给定节点到其它各节点的最短路径、径长;
3)节点间路径长度用矩阵形式表示;
4)可使用MATLAB 或者其他语言进行设计;
5)设计图形化界面展示本人的工作;

2.基本原理

1)Dijkstra算法是典型最短路径算法,用于计算单源点的最短路径问题,即求无向加权图G=<V,E,W>中一个节点到其他节点的最短路径。实际上就是根据网络的链路代价,采用广度优先搜索的思想,以起始点为中心向外层层扩展,直到扩展到终点为止来计算一对节点之间的最小代价路径。最短路径问题是图论中研究的一个重要课题,不仅仅指一般地理意义上的距离最短,还可以引申到其他的度量,如时间、费用、线路容量等。例如,城市交通中出行者选择出行路径,通信网络中的最可靠路径、最大容量路径问题等,都可以转化为最短路径问题。
2)操作步骤:
Step1:通过Dijkstra算法计算无向加权图G中的最短路径时,需要指定起点s。
Step2:引进两个集合S和U。S的作用是记录已求出最短路径的顶点以及相
应的最短路径长度,初始时被赋为 0。U记录还未求出最短路径的顶点
以及该顶点到起点s的距离,需要注意的是,U中顶点v的距离为(s,v)
的长度,如果s存在能直接到达v的边(s,v),则v的距离为(s, v);
如果s不存在能直接到达v的边(s,v),则v的距离为∞。
Step3:初始时,S中只有起点s,U中是除s之外的顶点。
Step4:从U中找出路径最短的顶点k,并将其加入到S中;接着,从U中移
除顶点k并更新U中的顶点和顶点对应的路径,之所以更新U中顶点
的距离,是由于确定了k是求出最短路径的顶点,从而可以利用k来更
新其它顶点的距离;例如,(s,v)的距离可能大于(s,k)+(k,v)的距离,则(s,v)
的距离更新为(s,k)+(k,v)的距离
Step5:重复操作步骤4),直到遍历完所有结点。
Dijkstra 每次循环都可以确定一个顶点的最短路径,故程序需要循环 n-1 次。
3)图解举例:
以下图为例,以v0为起始结点,对Dijkstra进行算法原理演示
在这里插入图片描述
在这里插入图片描述
Step1:将v0放入集合S,从v0开始,
找到与其邻接的点:v1、v2、v3,更新D(v1)、D(v2)、D(v3);
v0不与v4,v5,v6邻接,故D(v4)、D(v5)、D(v6)为∞。
在D(v)中找到最小值为1,其顶点为v1,
即此时已找到 v0到v1的最短路径为v0→v1。
Step2:将v1放入集合S,从v1开始,继续更新D(v):
v1与v2不邻接,不更新;
v1与v3不邻接,不更新;
v1与v4不邻接,不更新;
v1与v5邻接,v0→v1→v5的路径为7比D(v5)=∞小,故更新D(v5) ;
v1与v6不邻接,不更新。
在D(v)中找到最小值为2,其顶点为v2,
即此时又找到v0到v2的最短路径为v0→v2。
Step3:将v2放入集合S,从v2开始,继续更新D(v):
v2与v3不邻接,不更新;
v2与v4邻接,v0→v2→v4的路径为7比D(v4)=∞小,故更新D(v4) ;
v2与v5邻接,v0→v2→v5的路径为6比D(v5)=7小,故更新D(v5) ;
v2与v6不邻接,不更新;
在D(v)中找到最小值为3,其顶点为v3,
即此时又找到v0到v3的最短路径为v0→v3。
Step4:将v3放入集合S,从v3开始,继续更新D(v):
v3与v4邻接,v0→v3→v4的路径为7等于D(v4)=7,故不更新;
v3与v5不邻接,不更新;
v3与v6不邻接,不更新;
在D(v)中找到最小值为6,其顶点为v5,
即此时又找到v0到v5的最短路径为v0→v2→v5。
Step5:将v5放入集合S,从v5开始,继续更新D(v):
v5与v4不邻接,不更新;
v5与v6邻接,v0→v2→v5→v6的路径为14比D(v6)=∞小,故更新D(v6) ;
在D(v)中找到最小值为7,其顶点为v4,
即此时又找到v0到v4的最短路径为v0→v2→v4。
Step6:将v4放入集合S,从v4开始,继续更新D(v):
V4与v6邻接,v0→v2→v4→v6的路径为14等于D(v6)=14,故不更新;
在D(v)中找到最小值为14,其顶点为v6,
即此时又找到v0到v6的最短路径为v0→v2→v4→v6。
Step7:将v6放入集合S,所有点都已找到,停止。

3.仿真程序代码及分析

链接: https://blog.csdn.net/qq_44394952/article/details/122587805.

4.仿真结果及分析

界面展示
在这里插入图片描述

输入起始结点和目的结点
在这里插入图片描述

通过测试发现c++编程并在Qt中完成GUI界面实现的结果与计算结果一致。
综上,通过c++编程并在Qt中完成GUI界面主要实现了输入起始结点和目的结点,输出路径和距离的功能。
对比可以发现,GUI界面的实现是的实验结果可视化,界面更加友好美观。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值