DP 城市交通路网

【题目描述】

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

题目分析:

这题比较爽,首先我们要弄清那一堆二维数组的含义,a[i][]代表i城市的的去向距离,a[][j]代表去j城市的距离。

动态规划做这一题,设f[i]为i城市到10城市的最短距离,则f【10】=0,并将其他初始化为10000000。(代码解释原因)

动态转移方程为:f[i]=min(f[i],a[i][x]+f[x]) 条件:f[i]!=1000000,a[i][x]>0,i<x<=n;

代码实现:

#include<bits/stdc++.h>
using namespace std;
int main()
{
   int i,j,x,a[100][100],f[100],c[100];
   int n;
   cin>>n;
   for(i=1;i<=n;i++)
    for(j=1;j<=n;j++)
    cin>>a[i][j];    
   memset(f,1000000,sizeof(f));  //初始化f和c
    memset(c,0,sizeof(c));
   f[n]=0;                       //初始f[n]
   for(i=n-1;i>=1;i--)           //从终点逆推
    for(x=i+1;x<=n;x++)        //若f[x]=1000000说明x到终点城市不通
    if(a[i][x]>0&&f[x]!=1000000&&f[i]>a[i][x]+f[x])
    {                           //a[i][x]>0表示城市i和城市x通路
     c[i]=x;
     f[i]=f[x]+a[i][x];
     cout<<x<<" "<<i<<" "<<f[i]<<endl;
    }
   cout<<"minlong="<<f[1]<<endl;

   x=1;
   while(x!=0)
   {
       cout<<x<<" ";
       x=c[x];
   }
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值