图论------迪杰斯特拉(Dijkstra)算法求单源最短路径。

news2024/9/20 9:46:22

编程要求


在图的应用中,有一个很重要的需求:我们需要知道从某一个点开始,到其他所有点的最短路径。这其中,Dijkstra 算法是典型的最短路径算法。

本关的编程任务是补全右侧代码片段中 Begin 至 End 中间的代码,实现 Dijkstra 算法求单源最短路径,具体要求如下:

补全代码 int[] Paths(int source) 方法,实现 Dijkstra 算法;

输出源点 source 到其他各个定点的距离,如果不可达,则距离输出 INF。

测试举例
测试过程:

平台将创建用户补全后的ShortestPath类的对象;

调用对象的addEdge(int u, int v, int w)方法,添加边和边的权重信息,构建图G;

调用对象的Paths(int source)方法执行Dijkstra算法,求最短路径,并输出返回的最短路径,这里源点设置为1;

接着根据程序的输出判断程序是否正确。

以下是测试样例:

测试输入:

5 7
1 2 8
1 3 1
1 4 2
3 4 2
2 4 3
3 5 3
4 5 3
(5 和 7 分别表示顶点数和边数)

预期输出:

0 5 1 2 4 

思路解析:

        求单源最短路径就是求一个点到除它以外所有点的最短距离,首先我们还是用邻接矩阵来储存图的信息。以测试输入为例,示意图如下。


        既然是求1的单源最短路径,那我们就定义一个数组dic[n+1],将dic初始化存储从1到所有点的直接距离。比如dic[1]到dic[5]分别是【0,8,1,2,99999999】,因为1无法直接到5,所以初始化为99999999。

        然后找出dic里面1到2-n之间的最短距离,发现是dic[3] = 1,然后找1通过3能到达的地方,发现能到达4和5,如果1通过3到达4的话,得出dic[4] = 2 < dic[3]+arr[3][4] = 3,无法使到四的路程更短,所以不改变dic[4]的值,但是我们发现到达5,即dic[5] = 99999999>dic[3]+arr[3][5] = 4,能使1到5距离缩短,于是改变dic[5]的值。这样我们就得到能通过3进行优化一轮路径,学术名叫做松弛。

        


        我们知道,如果已经通过3实现了一轮优化,那么我们将进一步缩短路程的话,是不能走回头路的,因为如果再次经过3的话没有意义,所以最短路没有重复路径。

        那么我们就要定义一个数组来存储已经作为转点进行一轮松弛的点,我们可以定义book[n+1]来存储。将作为转点的点比如3,用book[3] = 1,表示已经使用过。

        之后便是重复步骤,找除去dic[3]以外的最小值,也就是dic[4],继续进行一轮松弛,将4这个点用book[4] = 1,表示已经使用过。

        之后的图大家可以自己试着来画出。

具体代码:

#include<stdio.h>

int main(void)

{

    int arr[100][100] = { 0 };

    int dic[100];

    int book[100] = { 0 };

    int m, n, a, b, c, u, v;

    int inf = 99999999;

    scanf("%d%d", &n, &m);

    for (int i = 1; i <= n; i++)

        for (int j = 1; j <= n; j++)

            if (i == j)

                arr[i][j] = 0;

            else

                arr[i][j] = inf;

    for (int i = 1; i <= m; i++)

    {

        scanf("%d%d%d", &a, &b, &c);

        arr[a][b] = c;

        arr[b][a] = c;

    }//无向图初始化。

    for (int i = 1; i <= n; i++)

        dic[i] = arr[1][i];//初始化dic数组


 

    for (int i = 1; i <= n - 1; i++)//最多要进行n-1轮松弛,i值不会使用,仅仅表示循环多少轮。

    {

        int min = inf;

        for (int j = 2; j <= n; j++)

        {

            if (book[j] == 0 && dic[j] < min)

            {

                min = dic[j];

                u = j;

            }

        }//找出从1到任意数字的最短值。

        book[u] = 1;//将该位置提前存储,表示已经使用过。

        for (v = 2; v <= n; v++)//优化1通过u到所有点的路径。

        {

            if (arr[u][v] < inf)//如果u到v没有通路,也就没办法优化。

            {

                if (dic[v] > dic[u] + arr[u][v])

                    dic[v] = dic[u] + arr[u][v];//优化赋值过程。

            }

        }

    }

    for (int i = 1; i <= n; i++)

        printf("%d ", dic[i]);//打印结果。

    return 0;

}

注意:

        实际上迪杰斯特拉算法可以看作是贪心算法,通过每一步的最优解组合成全局最优解,感兴趣的同学们可以去网上查找关于贪心算法的知识,这种类型的题目我们以后也会分享。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2036607.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

543 二叉树的直径

解题思路&#xff1a; \qquad 如果某一个点&#xff08;非叶子节点&#xff09;在最长路径上&#xff0c;那么应该有两种情况&#xff1a; \qquad 情况一&#xff1a;该节点为非转折点&#xff0c;最长路径经过其一个子节点 父节点&#xff1b; \qquad 情况二&#xff1a;该…

Rancher 使用 Minio 备份 Longhorn 数据卷

0. 概述 Longhorn 支持备份到 NFS 或者 S3, 而 MinIO 就是符合 S3 的对象存储服务。通过 docker 部署 minio 服务&#xff0c;然后在 Longhorn UI 中配置备份服务即可。 1. MinIO 部署 1.1 创建备份目录 mkdir -p /home/longhorn-backup/minio/data mkdir -p /home/longhor…

24经济师报名照上传技巧,无需下载照片工具

24经济师报名照上传技巧&#xff0c;无需下载照片工具 #中级经济师 #经济师 #高级经济师 #经济师报名照片 #中级经济师报名照片 #经济师考试

SPI通讯协议示例

目录 0x01 SPI通讯特点0x01 硬件SPI示例0x02 软件SPI示例 0x01 SPI通讯特点 SPI在接线方面会拥有片选引脚、时钟引脚、数据引脚&#xff0c;其中数据引脚又分为 MISO和MOSI&#xff0c;分别对应的是 “Master IN Slave Out”(主机输入从机输出) 和 “Master Out Slave IN”(主…

机械学习—零基础学习日志(如何理解线性代数)

零基础为了学人工智能&#xff0c;正在快乐学习&#xff0c;每天都长脑子 如何理解线性代数&#xff1f; 线性代数的本质是代数——代替数字。有时数学里有很多的规律&#xff0c;不以数字形式存在&#xff0c;可以用字幕替代。用一个通用的等式替代我们发现的规律。 代数研…

在VB.net中,CDbl、Double.Parse与Double.TryParse有什么区别

标题 在VB.net中&#xff0c;CDbl、Double.Parse与Double.TryParse有什么区别 正文 在VB.NET中&#xff0c;CDbl、Double.Parse和Double.TryParse都是用于将不同类型的值&#xff08;主要是字符串&#xff09;转换为Double类型的方法&#xff0c;但它们之间在用法、性能、错误处…

django学习入门系列之第七点《案例 添加页面》

文章目录 7.6 前端整合标准引入格式案例 添加页面 往期回顾 7.6 前端整合 HTMLCSSjavaScript、jQueryBootStrap&#xff08;动态效果依赖于jQuery&#xff09; 标准引入格式 css在上面js动态效果放下面bootstrap依赖于jQuery&#xff0c;所以先要有jQuery&#xff0c;再有bo…

汽车精密设计、无人机外形优化总是遇难题?CFD参数优化详解2来袭

数值仿真的参数优化 在上期文章中&#xff0c;我们给大家带来了机翼多学科优化、拟合试验曲线、一维CFD模型参数的DOE和回归分析三个参数优化案例&#xff0c;本期文章将继续为各位讲解多个 Altair CFD 参数优化案例&#xff0c;一起来看看吧。 案例&#xff1a;汽车排气管形状…

Jenkins链接Gitlab(HttpSSH方式)

文章目录 前言一、安装必要插件1、安装git2、安装Jenkins插件 二、配置git1、http方式&#xff08;1&#xff09;基础配置&#xff08;http方式配置凭证&#xff09;&#xff08;2&#xff09;测试 2、SSH方式配置凭证 总结 前言 为避免汉化导致的显示差异&#xff0c;以下操作…

通过Go示例理解函数式编程思维

一个孩子要尝试10次、20次才肯接受一种新的食物&#xff0c;我们接受一种新的范式&#xff0c;大概不会比这个简单。-- 郭晓刚 《函数式编程思维》译者 函数式编程(Functional Programming, 简称fp)是一种编程范式&#xff0c;与命令式编程(Imperative Programming)、面向对象编…

xlua使用

1. 安装 到 github 移动三个文件夹过去即可 Assets -》Plugins Assets -》Xlua Tools 移动到 unity里面的Assets目录即可 会在工具栏出现Xlua即安装成功 2. 引入基础类 ABMgr.cs using System.Collections; using System.Collections.Generic; using UnityEngine; using Un…

生成式人工智能(大语言模型)上线备案材料

材料总体一览 生成式人工智能&#xff08;大语言模型&#xff09;上线备案&#xff0c;除申请表外还需要提交五份材料&#xff1a; 《生成式人工智能 &#xff08;大语言模型&#xff09;上线备案申请表》 《附件1&#xff1a;安全自评估报告》 《附件2&#xff1a;模型服务协议…

django学习入门系列之第七点《案例 点击删除文本》

文章目录 前置回顾案例 点击删除文本总结往期回顾 前置回顾 HTML结构&#xff1a; 页面使用<!DOCTYPE html>声明为HTML5文档。<html>标签定义了页面的根元素&#xff0c;并且设置了lang"en"属性&#xff0c;表示页面内容使用英语。<head>部分包含…

统计回归与Matlab软件实现上(一元多元线性回归模型)

引言 关于数学建模的基本方法 机理驱动 由于客观事物内部规律的复杂及人们认识程度的限制&#xff0c;无法得到内在因果关系&#xff0c;建立合乎机理规律的数学模型数据驱动 直接从数据出发&#xff0c;找到隐含在数据背后的最佳模型&#xff0c;是数学模型建立的另一大思路…

数据结构 - 位图 | 布隆过滤器

文章目录 一、位图1、位图概念2、实现一个简略的位3、位图的优缺点4、位图的应用场景 二、布隆过滤器1、提出2、概念3、布隆过滤器的实现 三、海量数据处理1、哈希切割2、面试题 一、位图 1、位图概念 位图&#xff08;Bitmap&#xff09;是一种非常高效的数据结构&#xff0c…

【ocr识别003】flask+paddleocr+bootstrap搭建OCR文本推理WEB服务

1.欢迎点赞、关注、批评、指正&#xff0c;互三走起来&#xff0c;小手动起来&#xff01; 2.了解、学习OCR相关技术知识领域&#xff0c;结合日常的场景进行测试、总结。如本文总结的flaskpaddleocrbootstrap搭建OCR文本推理WEB服务应用示例场景。 文章目录 1.代码结构2.效果演…

【算法】梯度下降

一、引言 梯度下降算法&#xff08;Gradient Descent&#xff09;是一种一阶迭代优化算法&#xff0c;用于求解最小化目标函数的问题&#xff0c;广泛应用于机器学习和人工智能中的参数优化。 用于优化问题的迭代算法&#xff0c;尤其在机器学习和深度学习中广泛用于最小化损失…

EMQX Platform Snowflake:构建可再生分布式能源的智慧未来

引言 可再生能源如风力和太阳能发电&#xff0c;具有低成本和环保的特性&#xff0c;是未来能源供应的主要方向。然而&#xff0c;这类发电方式存在供应分散、设备数量多、地区分布广等特点。再加上不同地区的季节和天气变化&#xff0c;不确定性极大。 随着社会用电需求的持…

11 Radiobutton组件

11 Radiobutton组件 Tkinter 是 Python 的标准图形用户界面库&#xff0c;它提供了一个 Radiobutton 控件&#xff0c;用于在一组选项中让用户选择一个选项。Radiobutton 通常用于提供一组互斥的选项&#xff0c;用户只能选择其中一个。 Radiobutton 组件基础 Radiobutton 控…

CMake详解-捡重要的讲

CMake 通常我们使用cmake构建C++项目,其实就是编写CMakeLists.txt文件,过程如下 首先在创建项目名称,我这里是CMake文件夹,在路径下创建CMakeLists.txt文件,也就是在工作空间的目录下创建,具体有几个要素要设置 CMake最低版本要求项目名称-自定义即可编译方法:Debug或…