【题目描述】
下图表示城市之间的交通路网,线段上的数字表示费用,单向通行由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
#include<iostream>
using namespace std;
#define rep(i,a,b) for(int i=a;i<b;i++)
const int maxn=1000;
int N,dp[maxn][2]={},arr[maxn][maxn]={},idx1=0,idx2=1,idx3=1,st=0,en=1;
void update()
{
while(1)
{
bool fl=1;
rep(i,st,en)
{
if(arr[i][idx3]!=0)
{
fl=0;
idx3++;
break;
}
}
if(fl)
{
break;
}
}
}
void com()
{
update();
rep(i,idx2,idx3)
{
rep(j,st,en)
{
if(arr[j][i]==0)
{
continue;
}
else if(dp[i][0]==0)
{
dp[i][0]=dp[idx1+j-st][0]+arr[j][i];
dp[i][1]=idx1+j-st;
}
else
{
if(dp[i][0]>dp[idx1+j-st][0]+arr[j][i])
{
dp[i][0]=dp[idx1+j-st][0]+arr[j][i];
dp[i][1]=idx1+j-st;
}
}
}
}
idx1=idx2;
st=en;
en+=idx3-idx2;
idx2=idx3;
if(idx2!=N)
{
com();
}
}
void display(int i)
{
if(dp[i][1]!=0)display(dp[i][1]);
cout<<dp[i][1]+1<<" ";
}
int main()
{
cin>>N;
rep(i,0,N)
{
rep(j,0,N)
{
cin>>arr[i][j];
}
}
com();
cout<<"minlong="<<dp[N-1][0]<<"\n";
display(N-1);
cout<<N;
return 0;
}
该博客介绍了如何运用动态规划算法解决一个图论问题,即在给定的城市交通路网上找到从A点到E点的最短路径,并给出了具体的输入输出样例。通过输入城市的数量和费用矩阵,程序计算并输出了最短路径的费用和路径详情。

1623

被折叠的 条评论
为什么被折叠?



