解题思路:/*思路分析:
动归的方向有两种,一种由A->E,另一种则由E->A
这题要使用哪一种?
关键在于输出中 “第二行 A->E的最短路径。”
如果从A出发,根本不肯能记录下最短路径,因为dp[i]只记录了由起点A到当前点i的最短距离,
而无法判断其最终最短路径是哪一条
所以,我们只能使用逆推的方式
即 dp[i]记录了由i点到终点E的最短距离
再使用数组index去记录每一次由i点到终点最短距离的路径
最后从点A出发 即i=1出发,输出index[i]的值,且i的值更新为index[i]的值
这样输出的index[i]便是每一个点通往终点的最小值的下一个点。
*/
注意事项:
参考代码:
#include<bits/stdc++.h>
#define N 1000005;
using namespace std;
int f[1005][1005];//存储路径图,不知道n的范围,尽量大就好
int dp[1005];
int index[1005];//后序节点
int main()
{
int n;
cin>>n;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
cin>>f[i][j];
}
}
dp[n]=0;//终点通往自己的路径长为0,动归模板的关键之一!!!
for(int i=1;i<n;i++)
dp[i]=N;//无限远
for(int i=n-1;i>0;i--)
{
for(int j=i+1;j<=n;j++)
{
if(f[i][j]!=0&&dp[j]+f[i][j]<dp[i])//确定i点到终点的最短路径
{
dp[i]=dp[j]+f[i][j];
index[i]=j;//确定i点到终点的最短路径
}
}
}
cout<<"minlong"<<dp[1]<<endl;//确定i点到终点的最短路径
int flog=1;
while(flog){
cout<<flog<<" ";
flog=index[flog];
}
return 0;
}
0.0分
3 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复