81.动态规划求最短路径

 

81.动态规划求最短路径

81.动态规划求最短路径
 

5下图表示城市之间的交通路网,线段上的数字表示费用,单向通行由A->E。试用动态规划的最优化原理求出A->E的最省费用。
如图:求v1v10的最短路径长度及最短路径。
样例输入short.in
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
样例输出short.out
minlong=19
1  3  5  8  10
算法分析逆推法
       f[i]表示点iv10的最短路径长度,则 f[10]=0
  f[i]=min{ a[i][x]+f[x] a[i][x]>0 ,i}

自己的代码:

#include
using namespace std;
#include
const int INF=0x7fffffff;
int jz[101][101],f[101],next[101];
int main()
{
 int n;
 scanf("%d",&n);
 for(int i=1;i<=n;++i)
   for(int j=1;j<=n;++j)
   {
    scanf("%d",&jz[i][j]);
    f[i]=INF;
   }
 f[n]=0;
 for(int i=n-1;i>=1;--i)
   for(int j=i+1;j<=n;++j)
   {
    if(jz[i][j]!=0&&f[i]>f[j]+jz[i][j])
    {
     f[i]=f[j]+jz[i][j];
     next[i]=j;
    }
   }
 printf("minlong=%d\n",f[1]);
 int x=1;
 while(x!=n)
 {
  printf("%d-->",x);
  x=next[x];
 }
 printf("%d",n);

 return 0;
 }

参考代码:

  #include
  using namespace std;
  #include
  #include
  int main()
{
     long n,i,j,x,f[100],c[100],a[100][100];
     memset(a,0,sizeof(a));
     memset(c,0,sizeof(c));
     cin>>n;
     for (i=1;i<=n;i++)                         // 输入各个城市之间距离
       for (j=1;j<=n;j++)
         cin>>a[i][j];
     for (i=1;i<=n;i++)
       f[i]=1000000;                            // 初始化,默认每一个城市到达终点都是 1000000
     f[n]=0;
     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 通路
          f[i]=a[i][x]+f[x];                    // 城市 i 到终点最短路径的值
          c[i]=x;
        }
      cout<<"minlong="<<f[1]<<endl;             // 输出最短路径的值
      x=1;
w   while (x!=0)                              // 输出路过的各个城市
w        {
w           cout<<x<<' ';
w           x=c[x];
w        }
w        cout<<endl;
w   }


 

转载于:https://www.cnblogs.com/c1299401227/p/5370738.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值