1261:【例9.5】城市交通路网

1261:【例9.5】城市交通路网


时间限制: 1000 ms         内存限制: 65536 KB
提交数: 1387     通过数: 1029 

【题目描述】

下图表示城市之间的交通路网,线段上的数字表示费用,单向通行由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

【来源】


No

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define maxn 100
#define inf 1e9
int a[maxn][maxn];
int f[maxn];
int pre[maxn];
using namespace std;
int main()
{
    int n;
  scanf("%d",&n);
    memset(a,0,sizeof(a));
    memset(pre,0,sizeof(pre));
    for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++)
      scanf("%d",&a[i][j]);
        for(int i=1;i<=maxn;i++)
            f[i]=inf;
            f[n]=0;
    for(int i=n-1;i>=1;i--)
        for(int j=i+1;j<=n;j++)
    {
        if(a[i][j]>0&&f[j]!=inf&&f[i]>a[i][j]+f[j])

            {f[i]=f[j]+a[i][j];
            pre[i]=j;

    }
    }
    printf("minlong=%d\n",f[1]);
    int k=1;
    while(k!=0)
    {
        printf("%d ",k);
        k=pre[k];

            }
            printf("\n");
}

猜你喜欢

转载自blog.csdn.net/sdauguanweihong/article/details/86247361