信息学奥赛一本通 1261:城市交通路网(evd)
程序员文章站
2022-07-14 21:38:40
...
【题目描述】
下图表示城市之间的交通路网,线段上的数字表示费用,单向通行由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
【心得】挖地雷是取最大,该题只是取最小!而且起点就是1,简不简单!
【AC代码】
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
using namespace std;
const int N=105;
const int IMAX=9999;
int a[N][N],c[N],f[N];
int main()
{
int n,x;
cin>>n;
for(int i=1;i<=n;i++)
{
f[i]=IMAX;
for(int j=1;j<=n;j++) cin>>a[i][j];
}
f[n]=0;
for(int i=n-1;i>=1;i--)
{
for(int j=i+1;j<=n;j++)
{
if(a[i][j]&&f[j]+a[i][j]<f[i])
{
f[i]=f[j]+a[i][j];
c[i]=j;
}
}
}
cout<<"minlong="<<f[1]<<endl;
x=1;
while(c[x])
{
cout<<x<<' ';
x=c[x];
}
cout<<x;
return 0;
}