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

题目描述

对如下图所示的一个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.hqwc.cn/news/587061.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

视觉Transformer和Swin Transformer

视觉Transformer概述 ViT的基本结构&#xff1a; ①输入图片首先被切分为固定尺寸的切片&#xff1b; ②对展平的切片进行线性映射&#xff08;通过矩阵乘法对维度进行变换&#xff09;&#xff1b; ③为了保留切片的位置信息&#xff0c;在切片送入Transformer编码器之前&…

算法学习——LeetCode力扣图论篇1(797. 所有可能的路径、200. 岛屿数量、695. 岛屿的最大面积)

算法学习——LeetCode力扣图论篇1 797. 所有可能的路径 797. 所有可能的路径 - 力扣&#xff08;LeetCode&#xff09; 描述 给你一个有 n 个节点的 有向无环图&#xff08;DAG&#xff09;&#xff0c;请你找出所有从节点 0 到节点 n-1 的路径并输出&#xff08;不要求按特…

java中的string和stringbuff和stringBuilter

String类 String类是引用类型&#xff0c;而不是基础数据类型。 所有双引号括住的都是String类。 所有String类都是在方法区的字符常量池中存储数据&#xff0c;通过new String(“example”);创建的字符串在堆中有一个对象&#xff0c;其内容是一个指向字符常量池中一个指针。…

[羊城杯 2020]EasySer

[羊城杯 2020]EasySer 进入页面&#xff0c;发现是ubuntuapache2&#xff0c;但是好像没啥用 尝试访问/robots.txt&#xff0c;得到 访问/star1.php/&#xff0c;查看源码&#xff0c;得到提示 一看就知道是ssrf&#xff0c;使用http://127.0.0.1/ser.php&#xff0c;得到…

【攻防世界】warmup (代码审计)

进入题目环境&#xff0c;只有一个表情&#xff1a; ctrl u 查看源代码&#xff1a; 源代码提示我们访问 /source.php。访问结果如下&#xff1a; 我们进行代码审计&#xff0c;发现解题的关键点 include &_REQUEST[file]。但是题目使用了白名单进行了过滤。我们发现白名单…

dcoker 下redis设置密码

修改Docker里面Redis密码 Redis是一个开源的内存数据结构存储系统&#xff0c;常用于缓存、消息队列和数据持久化等场景。在使用Docker部署Redis时&#xff0c;默认情况下是没有设置密码的&#xff0c;这可能会导致安全隐患。因此&#xff0c;为了保证数据的安全性&…

网络攻防中的信息收集

目录 1.确定目标 2.目标阔线收集 2.1.子域名爆破 2.2.空间资产测绘 2.3.相关工具协助 3.指纹识别 4.相关地址 4.1.网站备案 4.2.资产测绘平台 4.3.工具 在渗透测试过程中&#xff0c;前期的一个信息打点过程可谓是尤为重要&#xff0c;但是如何做好前期的信息收集方式…

如何迁移WordPress站点

本周有一个Hostease客户&#xff0c;新购买linux虚拟主机&#xff0c;把WordPress站点&#xff0c;从旧主机迁移hostease新购买的Linux虚拟主机上&#xff0c;问题该如何操作&#xff0c;保证站点数据不丢失。通过我们提供教程&#xff0c;用户操作非常简单&#xff0c;并很快完…

2024052期传足14场胜负前瞻

2024052期售止时间为4月3日&#xff08;周三&#xff09;22点00分&#xff0c;敬请留意&#xff1a; 本期深盘多&#xff0c;1.5以下赔率7场&#xff0c;1.5-2.0赔率1场&#xff0c;其他场次是平半盘、平盘。本期14场难度中等偏下。以下为基础盘前瞻&#xff0c;大家可根据自身…

HBase详解(1)

HBase 简介 概述 HBase是Yahoo!公司开发的后来贡献给了Apache的一套开源的、分布式的、可扩展的、基于Hadoop的非关系型数据库(Non-Relational Database)&#xff0c;因此HBase并不支持SQL(几乎所有的非关系型数据库都不支持SQL)&#xff0c;而是提供了一套单独的命令和API操…

【蓝桥杯第十四届省赛B】(部分详解)

【01串的熵】 https://www.lanqiao.cn/problems/3498/learning/?subject_code1&group_code4&match_num14&match_flow1&origincup #include <iostream> #include<cmath> using namespace std; int main() {double n23333333;double sum0;for(int…

C语言之通讯录

c语言中的小小白-CSDN博客c语言中的小小白关注算法,c,c语言,贪心算法,链表,mysql,动态规划,后端,线性回归,数据结构,排序算法领域.https://blog.csdn.net/bhbcdxb123?spm1001.2014.3001.5343 给大家分享一句我很喜欢我话&#xff1a; 知不足而奋进&#xff0c;望远山而前行&am…