问题 C: 【例9.5】城市交通路网
时间限制: 1 Sec 内存限制: 128 MB提交: 2 解决: 2
[ 提交][ 状态][ 讨论版][命题人: quanxing]
题目描述
下图表示城市之间的交通路网,线段上的数字表示费用,单向通行由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 0
0 0 0 0 0 0 0 0 0 0
样例输出
minlong=19
1 3 5 8 10
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<string.h>
using namespace std;
int main()
{
int n;
cin>>n;
int a[100][100]; //输入
int find[1000]; //存储下一个走的城市
int shortway[1000]; //存储费用,从后往前存,最后的shortway【1】就是最少花费。
memset(find,0,sizeof(find));
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
cin>>a[i][j];
}
shortway[i]=100000; //初始化
}
shortway[n]=0;
for(int i=n-1;i>=1;i--) //从后面的城市开始寻找
{
for(int j=1;j<=n;j++)
{
if(a[i][j]>0&&shortway[i]>shortway[j]+a[i][j]&&shortway[j]!=100000)
{
shortway[i]=shortway[j]+a[i][j];
find[i]=j;
}
}
}
int x=1;
cout<<"minlong="<<shortway[1]<<endl;
while(x!=0)
{
cout<<x<<" ";
x=find[x];
}
return 0;
}
#include<cstdio>
#include<algorithm>
#include<string.h>
using namespace std;
int main()
{
int n;
cin>>n;
int a[100][100]; //输入
int find[1000]; //存储下一个走的城市
int shortway[1000]; //存储费用,从后往前存,最后的shortway【1】就是最少花费。
memset(find,0,sizeof(find));
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
cin>>a[i][j];
}
shortway[i]=100000; //初始化
}
shortway[n]=0;
for(int i=n-1;i>=1;i--) //从后面的城市开始寻找
{
for(int j=1;j<=n;j++)
{
if(a[i][j]>0&&shortway[i]>shortway[j]+a[i][j]&&shortway[j]!=100000)
{
shortway[i]=shortway[j]+a[i][j];
find[i]=j;
}
}
}
int x=1;
cout<<"minlong="<<shortway[1]<<endl;
while(x!=0)
{
cout<<x<<" ";
x=find[x];
}
return 0;
}