算法 动态规划 求最短路径

本文介绍了使用动态规划解决最短路径问题的方法,通过将问题分解为多个子问题,建立动态规划函数,逐步求解每个顶点的最短路径。以从顶点0到顶点9为例,阐述了如何通过前一个顶点的距离加上当前顶点距离来计算最短路径,并给出了具体的动态规划公式。最后,提到了在实际图中可能存在的多个前一个顶点的情况,并附上了代码实现及运行结果。
摘要由CSDN通过智能技术生成

动态规划:即将要求解的问题分解成多个相互重叠的子问题,根据子问题找到递推关系,即动态规划函数,然后将各子问题的解填入表中,下次就可以直接查表得到子问题的解啦。

动态规划求最短路径问题:

求解从顶点0到顶点9的最短路径,如图:

图一

从顶点0到顶点9的最短路径可以分解为从从起点到顶点9的前一个顶点的最短距离+该顶点到9的距离。这样,从起点到每个顶点的距离都可以分解为起点到该顶点的前一个点的最短距离+前一个点到该点的距离。

用 d(i) 表示到顶点i的最短路径,c(i,j) 表示从顶点 i 到 j 的路径。

则 d(i) = d(i-1) + c(i-1,i)

注:这里 i-1 表示顶点 i 的前一个顶点,不一定有 (i-1)+1=i,例如该图中顶点9的前一个顶点有两个:7和8,取7还是8,取决于起点到7和8的距离谁更短。这样每一个顶点都可以分解为这样的子问题。

代码如下:

#include<iostream>
using namespace std;
#include<iomanip>
#define N 10 
int d[N];//最短距离
int s[N];//最短路径经过的顶点
int Rote[N][N] = {
     //原路径图
 {
   0,4,1,0,0,0,0,0,0,0},
 {
   0,0,0,0,9,8,0,0,0,0},
 {
   0,0,0,1,6,0,8,0,0,0},
 {
   0,0,0,0
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值