信息学奥赛一本通(1261:【例9.5】城市交通路网)
1261:【例9.5】城市交通路网
时间限制: 1000 ms 内存限制: 65536 KB
提交数: 6359 通过数: 4564
【题目描述】
下图表示城市之间的交通路网,线段上的数字表示费用,单向通行由A->E。试用动态规划的最优化原理求出A->E的最省费用。
如图:求v1到v10的最短路径长度及最短路径。
【输入】
第一行为城市的数量N;
后面是N*N的表示两个城市间费用组成的矩阵。
【输出】
A->E的最省费用。
【输入样例】
10 0 2 5 1 0 0 0 0 0 0 0 0 0 0 12 14 0 0 0 0 0 0 0 0 6 10 4 0 0 0 0 0 0 0 13 12 11 0 0 0 0 0 0 0 0 0 0 3 9 0 0 0 0 0 0 0 0 6 5 0 0 0 0 0 0 0 0 0 10 0 0 0 0 0 0 0 0 0 0 5 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0
【输出样例】
minlong=19 1 3 5 8 10
【分析】
设a[i][j]存储距离矩阵,表示城市 i 到城市 j 的距离,f[i]记录从i~n的最短路径,pre[i]记录f[i]的前驱结点。逆推实现。
(1)划分阶段。
阶段:如图所示;样例中共有4个阶段。
(2)确定状态和状态变量。
状态:城市编号划分状态。状态信息用a[i][j]表示。
(2)确定决策并写出状态转移方程。
f[j]的值从哪来?当然是从后面f[i]来。决策:同阶段的城市中选哪一个?策略:最短路径。故,状态转移方程: f[i]=min{ a[i][j]+f[j] | a[i][j]>0, j<i<=n }。
(4)寻找边界条件。
逆推时, 边界:f[n]=0。目标:f[1]。
(5)设计并实现程序。
【参考代码】
#include <stdio.h>
#define inf 0x3f3f3f3f
#define N 110int a[N][N]; //邻接矩阵,表示城市i到城市j的距离
int f[N]; //f[i]记录从i~n的最短路径
int pre[N]; //记录f[i]前驱结点
int n; //图中顶点的个数void floyd()
{int i,j,k;f[n]=0; for(i=n-1;i>=1;i--) //从终点往前逆推,计算最短路径for(j=i+1;j<=n;j++) //f[j]=inf,表示城市j到终点城市不通 {if(a[i][j]>0 && f[j]!=inf ) //i到j点通,j到终点通 {if(f[i]>a[i][j]+f[j]){f[i]=f[j]+a[i][j]; //城市i到终点n最短路径pre[i]=j; //记录f[i]的前驱结点,即f[j]点 }}}
}int main()
{int i,j,k;scanf("%d",&n);for(i=1;i<=n;i++) //输入各城市之间的距离 for(j=1;j<=n;j++)scanf("%d",&a[i][j]);for(i=1;i<=N;i++) //初始化,默认每个城市到达终点的距离为无穷大 f[i]=inf;floyd();printf("minlong=%d\n",f[1]); //输出1~n的最短路径值k=1;while(k!=0) //输出路过的各个城市{printf("%d ",k);k=pre[k];}printf("\n");return 0;
}
http://ybt.ssoier.cn:8088/problem_show.php?pid=1261
信息学奥赛一本通(1261:【例9.5】城市交通路网)相关推荐
- 【例1】 0/1背包《信息学奥赛一本通》【解法一】 02
/* [例1] 0/1背包<信息学奥赛一本通>[解法一] 02 http://ybt.ssoier.cn:8088/problem_show.php?pid=1267 */ #includ ...
- 【例8】合唱队形(《信息学奥赛一本通第五版》)
/* [例8]合唱队形(<信息学奥赛一本通第五版>) http://ybt.ssoier.cn:8088/problem_show.php?pid=1264 [问题描述] N位同学站成一排 ...
- 信息学奥赛一本通 2021:【例4.6】最大公约数
[题目链接] ybt 2021:[例4.6]最大公约数 [题目考点] 1. while循环 2. 求最大公约数 辗转相减法 辗转相除法 [解题思路] 解法1:枚举 取较小数字,从该数字的值开始从大到小 ...
- 信息学奥赛一本通(2032:【例4.18】分解质因数)
2032:[例4.18]分解质因数 时间限制: 1000 ms 内存限制: 65536 KB 提交数: 582 通过数: 376 [题目描述] 把一个合数分解成若干个质因数乘积 ...
- 信息学奥赛一本通——2062:【例1.3】电影票
2062:[例1.3]电影票 时间限制: 1000 ms 内存限制: 65536 KB 提交数: 57341 通过数: 34230 [题目描述] 已知一位小朋友的电影票价是10 ...
- 信息学奥赛一本通 1278:【例9.22】复制书稿(book) | 洛谷 P1281 书的复制
[题目链接] ybt 1278:[例9.22]复制书稿(book) 洛谷 P1281 书的复制 [题目考点] 1. 动态规划:线性动规 [解题思路] 该题可以抽象为:将由m个数字构成的序列分成k个子段 ...
- 信息学奥赛一本通1267:【例9.11】01背包问题(二维dp与滚动数组优化)
[题目描述] 一个旅行者有一个最多能装 MM 公斤的背包,现在有 nn 件物品,它们的重量分别是W1,W2,...,WnW1,W2,...,Wn,它们的价值分别为C1,C2,...,CnC1,C2,. ...
- 信息学奥赛一本通C++语言-----2036:【例5.3】开关门
[题目描述] 宾馆里有n(2≤n≤1000)n(2≤n≤1000) 个房间,从1∼n1∼n 编了号.第一个服务员把所有的房间门都打开了,第二个服务员把所有编号是22 的倍数的房间"相反处理& ...
- 信息学奥赛一本通——2068:【例2.6】鸡兔同笼
大家好(๑╹◡╹)ノ" 这里是小蒟蒻 一天没更新了呢! 今天给大家带来<信息学奥赛一本通--2068:[例2.6]鸡兔同笼> 题目: 2068:[例2.6]鸡兔同笼 时间限制: ...
- 信息学奥赛一本通C++语言-----2048:【例5.18】串排序
[题目描述] 对给定的n(1≤n≤20)n(1≤n≤20)个国家名(国家名字长度不超过2020),按其字母的顺序输出. [输入] 第一行为国家的个数nn: 以下nn行为国家的名字. [输出] nn行, ...
最新文章
- 三菱伺服电机选型手册_PLC触摸屏控制伺服电机程序设计
- 章国锋:视觉SLAM最新观点分享
- 大文件表空间+创建大文件表空间+查询数据库表空间类型信息+查询数据库表空间类型信息...
- 解决子级用css float浮动 而父级div没高度不能自适应高度
- 解决在IE6下使用display: inline-block;的不兼容性问题
- ARM-linux的启动流程
- 美国邮编大全及邮政编码规范
- linux鼠标垫图片,如何自制智能游戏鼠标垫
- android 禁止截屏 工具,Android禁止截屏插件
- 中学-综合素质【3】
- 根据sam文件计算reads的GC含量
- Java程序员技术书籍指南
- CPU卡指令返回错误集
- 渗透tools之Lizard
- 推荐几个我收藏且星标的嵌入式技术公众号
- 基于vue和nodejs毕业设计酒店预约管理系统
- 淘宝特价版推出省心版,为什么难“钉“老人心?
- html图片左右无缝循环滚动示例
- xxljob定时在sftp上传下载
- 【Unity VR开发】VRTK 4.0 配置