最短路径(线性DP)
求出从1到n的最短路径 并且输出经过的点
第一行一个整数n,接下来输入一个n*n的矩阵,第i行第j列的数表示i到j有一条长度为此数的路径,若为0则不存在此路径,并且数据保证当i>=j输入的数为0
输出第一行minlong=路径长度,第二行输出经过的点的编号
样例输入
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 n<=15 题目保证图的连通性
之前好像学过一点DP,但发现仍是一脸懵逼……所以现在重新温故一遍(对不起学长Orz)。这是一道很基础的入门DP(然而现在我才会),所以说论预习的重要性,否则就是白费了学长的心血
解析:
- 首先邻接矩阵记录路径长度不多说
- 然后我们从终点推向起点
- DP条件:
- 得有路走(mp[i][j] > 0)
- 从后往前,走过的路得是更新过的
- 当前的方向上挑最短路走
代码如下:
#include<stdio.h> #include<algorithm> using namespace std; const int inf = 0x7ffffff; int mp[16][16],f[16],rout[2002]; int main() { int n; scanf("%d",&n); for(int i=1;i<=n;++i) { f[i]=inf; for(int j=1;j<=n;++j){ scanf("%d",&mp[i][j]); } } f[n]=0; for(int i=n-1;i>=1;--i) { for(int j=i+1;j<=n;++j) { if(mp[i][j]>0 && f[j]!=inf && (mp[i][j]+f[j]<f[i])) { f[i]=f[j]+mp[i][j]; rout[i]=j; } } } printf("minlong=%d\n",f[1]); int x=1; while(x!=0) { printf("%d ",x); x=rout[x]; } return 0; }
从0到1很难,但从1到100很容易
本文作者:qseer
本文链接:https://www.cnblogs.com/qseer/p/9427153.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何打造一个高并发系统?
· .NET Core GC压缩(compact_phase)底层原理浅谈
· 现代计算机视觉入门之:什么是图片特征编码
· .NET 9 new features-C#13新的锁类型和语义
· Linux系统下SQL Server数据库镜像配置全流程详解
· Sdcb Chats 技术博客:数据库 ID 选型的曲折之路 - 从 Guid 到自增 ID,再到
· Winform-耗时操作导致界面渲染滞后
· Phi小模型开发教程:C#使用本地模型Phi视觉模型分析图像,实现图片分类、搜索等功能
· 语音处理 开源项目 EchoSharp
· drools 规则引擎和 solon-flow 哪个好?solon-flow 简明教程