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. 【例1】 0/1背包《信息学奥赛一本通》【解法一】 02

    /* [例1] 0/1背包<信息学奥赛一本通>[解法一] 02 http://ybt.ssoier.cn:8088/problem_show.php?pid=1267 */ #includ ...

  2. 【例8】合唱队形(《信息学奥赛一本通第五版》)

    /* [例8]合唱队形(<信息学奥赛一本通第五版>) http://ybt.ssoier.cn:8088/problem_show.php?pid=1264 [问题描述] N位同学站成一排 ...

  3. 信息学奥赛一本通 2021:【例4.6】最大公约数

    [题目链接] ybt 2021:[例4.6]最大公约数 [题目考点] 1. while循环 2. 求最大公约数 辗转相减法 辗转相除法 [解题思路] 解法1:枚举 取较小数字,从该数字的值开始从大到小 ...

  4. 信息学奥赛一本通(2032:【例4.18】分解质因数)

    2032:[例4.18]分解质因数 时间限制: 1000 ms         内存限制: 65536 KB 提交数: 582     通过数: 376 [题目描述] 把一个合数分解成若干个质因数乘积 ...

  5. 信息学奥赛一本通——2062:【例1.3】电影票

    2062:[例1.3]电影票 时间限制: 1000 ms         内存限制: 65536 KB 提交数: 57341     通过数: 34230 [题目描述] 已知一位小朋友的电影票价是10 ...

  6. 信息学奥赛一本通 1278:【例9.22】复制书稿(book) | 洛谷 P1281 书的复制

    [题目链接] ybt 1278:[例9.22]复制书稿(book) 洛谷 P1281 书的复制 [题目考点] 1. 动态规划:线性动规 [解题思路] 该题可以抽象为:将由m个数字构成的序列分成k个子段 ...

  7. 信息学奥赛一本通1267:【例9.11】01背包问题(二维dp与滚动数组优化)

    [题目描述] 一个旅行者有一个最多能装 MM 公斤的背包,现在有 nn 件物品,它们的重量分别是W1,W2,...,WnW1,W2,...,Wn,它们的价值分别为C1,C2,...,CnC1,C2,. ...

  8. 信息学奥赛一本通C++语言-----2036:【例5.3】开关门

    [题目描述] 宾馆里有n(2≤n≤1000)n(2≤n≤1000) 个房间,从1∼n1∼n 编了号.第一个服务员把所有的房间门都打开了,第二个服务员把所有编号是22 的倍数的房间"相反处理& ...

  9. 信息学奥赛一本通——2068:【例2.6】鸡兔同笼

    大家好(๑╹◡╹)ノ" 这里是小蒟蒻 一天没更新了呢! 今天给大家带来<信息学奥赛一本通--2068:[例2.6]鸡兔同笼> 题目: 2068:[例2.6]鸡兔同笼 时间限制: ...

  10. 信息学奥赛一本通C++语言-----2048:【例5.18】串排序

    [题目描述] 对给定的n(1≤n≤20)n(1≤n≤20)个国家名(国家名字长度不超过2020),按其字母的顺序输出. [输入] 第一行为国家的个数nn: 以下nn行为国家的名字. [输出] nn行, ...

最新文章

  1. 三菱伺服电机选型手册_PLC触摸屏控制伺服电机程序设计
  2. 章国锋:视觉SLAM最新观点分享
  3. 大文件表空间+创建大文件表空间+查询数据库表空间类型信息+查询数据库表空间类型信息...
  4. 解决子级用css float浮动 而父级div没高度不能自适应高度
  5. 解决在IE6下使用display: inline-block;的不兼容性问题
  6. ARM-linux的启动流程
  7. 美国邮编大全及邮政编码规范
  8. linux鼠标垫图片,如何自制智能游戏鼠标垫
  9. android 禁止截屏 工具,Android禁止截屏插件
  10. 中学-综合素质【3】
  11. 根据sam文件计算reads的GC含量
  12. Java程序员技术书籍指南
  13. CPU卡指令返回错误集
  14. 渗透tools之Lizard
  15. 推荐几个我收藏且星标的嵌入式技术公众号
  16. 基于vue和nodejs毕业设计酒店预约管理系统
  17. 淘宝特价版推出省心版,为什么难“钉“老人心?
  18. html图片左右无缝循环滚动示例
  19. xxljob定时在sftp上传下载
  20. 【Unity VR开发】VRTK 4.0 配置

热门文章

  1. 用C语言写PHP扩展 linux
  2. Velocity语法参考
  3. Nginx的这些妙用,你肯定有不知道的!
  4. 漫话:如何给女朋友解释什么是适配器模式?
  5. 律师坚称技术无罪:“钉钉打卡神器”开发者二审被改判四年
  6. 百度十亿级流量的搜索前端,是怎么做架构升级的?
  7. 未来科技风口:ABCD
  8. InnoDB文档笔记(三)—— Undo Log
  9. 简述Spring技术内幕
  10. HDU-1285-确定比赛名次