算法设计与分析:第四章 动态规划 4.3多段图的最短路径问题

本文详细介绍了多段图的最短路径问题及其动态规划解决方案。通过两个阶段的决策过程,确定从源点到收点的最优路径。算法包括逆序递推和顺序递归两种方式,并提供了读取数据、计算最短路径和打印路径的功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

/*
多段图的最短路径问题:
定义: 给定有向带权图G(V,E,W),如果把顶点集合V划分成
k个不相交的子集V i ,1≤i ≤k,k≥2,使得E中的任何一条边
(u,v),必有uЄ V i, v ∈ V i+m  ,m≥1,则称这样的图为多段图。

决策的第一阶段:确定图中第k-1段的所有顶点到达收点t的花费最小的通路。把这些信息保存
起来,在最后形成最优决策时使用。用数组cost[i]存放顶点i到达手电t的最小花费,用数组path[i]
存放顶点i到达收点t的最小花费通路上的前方顶点编号

决策第二阶段:确定途中第k-2段的所有顶点到收点t的花费最小的通路。这时,利用第一阶段形成的信息来进行
决策,并把决策的结果存放在数组cost和path的相应元素中,依次进行,直到最后确定源点s到收点t的花费最小的
通络。
源点s的path数组中就是最优决策序列

思想:
1设cost[i]表示顶点i到收点t的最短花费
2动态规划方程:cost[i] =  min{c[i][j] + cost[j]},1<= j <= n ,并且j != i中
 path[i] = j,j是使得c[i][j] + cost[j]最小的j
3 边界条件:cost[n-1] = 0
4 目标状态:cost[0]

算法步骤:
用route[n]存放从源点s出发到达收点t的最短通路上的顶点编号
1)对所有的i,0<=i<n,把cost[i]初始化为最大值,path[i]初始化为-1,cost[n-1]初始化为0
2)令i = n - 2;
3)根据状态迁移方程计算cost[i]和path[i]
4)另i = i -1 ;若i > = 0,转步骤(3),否则转到步骤(5)
5)另i = 0 ,route[i] = 0
6)若route[i] = n-1,算法结束,否则转步骤(7)
7)i = i + 1,route[i] = path[route[i-1],转步骤(6)

输入说明:
首行:顶点个数,顶点从0开始
接下来:每一行分别是:起始结点编号 终止结点编号 权值

输入:
10(顶点个数) 19(边的条数)
0 1 4
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值