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

/*
多段图的最短路径问题:
定义: 给定有向带权图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
0 2 1
0 3 3

1 4 9
1 5 8
2 3 1
2 4 6
2 5 7
2 6 8
3 5 4
3 6 7

4 7 5
4 8 6
5 7 8
5 8 6
6 7 6
6 8 5

7 9 7
8 9 3

输出:
15
0 2 3 5 8 9
*/

/*
关键:
1 逆序方式 
  • 6
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值