用动态规划求解多段图的最短路径问题

news2024/10/7 4:34:41

题目描述

对如下图所示的一个5段图,图上的数字代表该段路径的成本。写出求最短路径的计算过程,给出最短路径和距离。
在这里插入图片描述

思路分析

  1. 创建一个边权数组edgeWeigth,存储顶点和边的信息,用来表示图
  2. 创建一个cost数组,索引index代表顶点序号,cost[index]表示从起点1到达顶点index的最小路径和。cost实际上就是dp数组
  3. 状态转移方程:cost[index] = min{cost[指向index的顶点] + edgeWeigth[start][end]}start代表起点,end代表终点,要找到指向index的顶点,需要遍历边权数组。当index = 顶点总数N时,cost[N]就是我们要求的最短路径和
  4. dp的过程中,顺便用一个辅助数组path记录路径上的顶点

代码

#include <stdio.h>

#define INF 666 // infinity,定义无穷大
#define N 10  //顶点数

//vertex 0 is not used
int edgeWeight[N + 1][N + 1]; //边权数组
int path[N + 1] = {-1}; //路径数组

void CreateGraph(int vertexNum, int edgeNum);
int searchPath();
void printPath();

int main()
{
    // 读取顶点数和边数
    int vertexNum, edgeNum;
    scanf("%d%d", &vertexNum, &edgeNum);

    //创建边权图
    CreateGraph(vertexNum, edgeNum);

    printf("最短路径长度为:%d\n", searchPath());

    //输出最短路径
    printPath();

    return 0;
}

void CreateGraph(int vertexNum, int edgeNum)
{
    //初始化边的权值
    for (int i = 0; i <= vertexNum; i++)
        for (int j = 0; j <= vertexNum; j++)
            edgeWeight[i][j] = INF;

    //读取边的权值
    int weight;
    for (int i = 0; i < edgeNum; i++)
    {
        int v1, v2;
        scanf("%d%d%d", &v1, &v2, &weight);
        edgeWeight[v1][v2] = weight;
    }
}

// 求 N 个顶点的多段图的最短路径
int searchPath()
{
    int cost[N + 1]; //cost[index] 是到index顶点的已知最短路径的权值和
    cost[1] = 0;    //顶点1为起点
    for (int i = 2; i <= N; i++)
        cost[i] = INF;

    //v1 是起点,v2 是终点
    for (int v2 = 2; v2 <= N; v2++)
        for (int v1 = v2 - 1; v1 >= 1; v1--)
            //动态规划更新cost数组的信息
            if (cost[v1] + edgeWeight[v1][v2] < cost[v2])
            {
                cost[v2] = cost[v1] + edgeWeight[v1][v2];
                path[v2] = v1;  //表示最短路径中v2的前一个点是v1
            }

    return cost[N]; // 返回最短路径长度
}

//输出最短路径
void printPath()
{

    int positivePath[N + 1];    //正向路径
    positivePath[0] = N;    //终点顶点放在第一位
    int cnt = 1;    //记录路径中的顶点数

    //析取逆向路径
    int i = N;
    while (path[i] > 0)
    {
        positivePath[cnt++] = path[i];
        i = path[i];
    }

    //打印正向路径
    for (int i = cnt - 1; i > 0; i--)
        printf(" %d ->",positivePath[i]);

    printf(" %d",positivePath[0]);

}

测试输入

第一行:顶点数和边数
其余行:顶点标号 顶点标号 两顶点的边的权值
10 18
1 2 4
1 3 2
1 4 3
2 5 10
2 6 9
3 5 6
3 6 7
3 7 10
4 6 3
4 7 8
5 8 4
5 9 8
6 8 9
6 9 6
7 8 5
7 9 4
8 10 8
9 10 4

结果

在这里插入图片描述

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

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

相关文章

【MySQL系列】使用 ALTER TABLE 语句修改表结构的方法

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

STM32 DWT数据观察触发器作为延时函数的使用

STM32 DWT数据观察触发器作为延时函数的使用 &#x1f4d1;DWT(Data Watchpoint and Trace数据观察触发器&#xff09;描述 &#x1f4dd;DWT是属于处理器内核单元中的调试组件之一&#xff0c;由四个比较器组成。它们可配置为&#xff1a;硬件监视点或对ETM或PC采样器或数据地…

智慧工厂建设全面指南 从规划到实施

随着工业4.0和工业互联网的发展&#xff0c;智慧工厂已成为制造业的热门话题。智慧工厂通过运用先进的信息技术、自动化技术和人工智能技术&#xff0c;实现生产过程的智能化、数字化和网络化&#xff0c;提高生产效率、降低生产成本、提升产品质量&#xff0c;为企业创造更大的…

【C++第二阶段】文件操作

以下内容仅为当前认识&#xff0c;可能有不足之处&#xff0c;欢迎讨论&#xff01; 文章目录 文件操作文件写入流程简单的demo写操作 文件读流程二进制写文件二进制读文件 文件操作 文件写入流程 写文件包括以下几个步骤 1.包含头文件 2.创建流对象 3.打开文件&#xff0…

CSS面试题---基础

1、css选择器及优先级 选择器优先级&#xff1a;内联样式>id选择器>类选择器、属性选择器、伪类选择器>标签选择器、微元素选择器 注意&#xff1a; !important优先级最高&#xff1b; 如果优先级相同&#xff0c;则最后出现的样式生效&#xff1b; 继承得到的样式优先…

商城网站-礼品网站首页html+css+js+说明文档

网页设计与网站建设作业htmlcssjs 预览 说明 单页面&#xff0c;轮播图 获取&#xff1a;https://hpc.baicaitang.cn/2077.html

MyBatis-Plus04(条件构造器)

条件构造器和常用接口 wrapper介绍 Wrapper &#xff1a; 条件构造抽象类&#xff0c;最顶端父类 AbstractWrapper &#xff1a; 用于查询条件封装&#xff0c;生成 sql 的 where 条件 QueryWrapper &#xff1a; 查询条件封装 UpdateWrapper &#xff1a; Update 条件封装 A…

【stm32】USART编码部分--串口数据包

USART串口数据包【源码放在最后】 关于数据包的分类 关于数据包的发送 如果想要发送Hex数据包&#xff0c;定义一个数组填充数据&#xff0c;然后使用串口模块函数SendArray进行发送 如果想要发送文本数据包&#xff0c;写一个字符串然后调用SendString进行发送 对于发送数据…

BEV的多传感器融合方案

多模态融合 早期融合&#xff08;Early Fusion&#xff09;晚期融合&#xff08;Late Fusion&#xff09;深度融合&#xff08;Deep Fusion&#xff09; BEVFusion - MITBEVFusion - 阿里&北大UniTR 感知技术中相机和雷达数据融合方法的概述&#xff0c;这些方法分别是早期…

[原创] MOS管选型

一、选型背景 MOS管是常用元器件之一&#xff0c;学校出来后&#xff0c;很多人都对BJT感兴趣和熟悉&#xff0c;对MOS的熟悉度相对BJT要少一些&#xff0c;即使工作了两三年&#xff0c;对MOS的理解也还是不多&#xff0c;下面通过对MOS管的一些参数解读&#xff0c;加深对MO…

第二届安徽省中小学科技竞赛经验交流会暨NOC省赛解读会在肥顺利举办

阳春三月&#xff0c;喜泰开来。3月30日&#xff0c;第二届安徽省中小学科技竞赛经验交流会暨NOC省赛解读会在合肥顺利举办&#xff01;本次会议由安徽省人工智能学会主办&#xff0c;赛哆哆承办&#xff0c;会议吸引了近两百名来自全省的中小学教师和科技培训教师&#xff0c;…

【浅尝C++】STL第三弹=>list常用接口使用示例/list底层结构探索/list模拟实现代码详解

&#x1f3e0;专栏介绍&#xff1a;浅尝C专栏是用于记录C语法基础、STL及内存剖析等。 &#x1f3af;每日格言&#xff1a;每日努力一点点&#xff0c;技术变化看得见。 文章目录 list介绍list常用接口使用示例构造类函数迭代器属性与元素获取增删改操作 list底层结构探索list模…

【保姆级讲解下Docker容器】

&#x1f308;个人主页:程序员不想敲代码啊 &#x1f3c6;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f44d;点赞⭐评论⭐收藏 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共…

CTK插件框架学习-信号槽(05)

CTK插件框架学习-事件监听(04)https://mp.csdn.net/mp_blog/creation/editor/137171155 一、主要流程 信号发送者告诉服务要发送的信号信号发送者发送信号信号接收者告诉服务当触发某个订阅的主题时通知槽函数信号接收者处理槽函数信号槽参数类型必须为&#xff08;const ctk…

Keepalived+MySQL简单搭建实现数据库高可用

需求&#xff1a;想要实现当MySQL服务挂了之后&#xff0c;能够自动切换到另一台&#xff0c;不对当前服务造成过多影响。查找了很多实现数据库高可用方案&#xff0c;比较常见的有MHA&#xff08;至少三台&#xff0c;一主多从&#xff09;、开源数据库中间件&#xff08;Myca…

推箱子_java源码_50张地图_带背景音乐

一. 演示视频 推箱子_java源码_50张地图_带背景音乐 二. 实现步骤 完整项目获取 https://githubs.xyz/y23.html 部分截图 map地图实现 00000000000000000000 00000000000000000000 00000000000000000000 00000000000000000000 00000000000000000000 00000000000000000000 00…

golang和Java的简单介绍和对比

一、golang 1、Golang简介 Golang&#xff0c;也称为Go&#xff0c;是由Google公司在2009年推出的开源编程语言&#xff0c;由罗伯特格瑞史莫(Rob Pike)、肯汤普逊(Ken Thompson)、罗勃派克(Robert Griesemer)等人设计。Go语言的目标是在保持简单高效的编程模型的同时&#xf…

NumPy创建ndarray数组大揭秘

1.使用 np.array() 创建 使用 np.array() 由 python list 创建 n np.array(list) 注意 numpy 默认 ndarray 的所有元素的类型是相同的 如果传进来的列表中包含不同的类型&#xff0c;则统一为同一类型&#xff0c;优先级&#xff1a;str > float > int ndarray 的常…

自动驾驶中基于Transformer的传感器融合:研究综述

自动驾驶中基于Transformer的传感器融合&#xff1a;研究综述 论文链接&#xff1a;https://arxiv.org/pdf/2302.11481.pdf 调研链接&#xff1a;https://github.com/ApoorvRoboticist/Transformers-Sensor-Fusion 附赠自动驾驶学习资料和量产经验&#xff1a;链接 摘要 本…

【论文笔记】Text2QR

论文&#xff1a;Text2QR: Harmonizing Aesthetic Customization and Scanning Robustness for Text-Guided QR Code Generation Abstract 二维码通常包含很多信息但看起来并不美观。stable diffusion的出现让平衡扫描鲁棒性和美观变为可能。 为了保证美观二维码的稳定生成&a…