zoukankan      html  css  js  c++  java
  • 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 ",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 }


     

  • 相关阅读:
    工程思维
    小骆驼 第三章 列表与数组
    小骆驼 第二章 标量数据
    小骆驼 第二章 标量数据
    小骆驼 第二章 标量数据
    split和join合写
    Competition and Predation
    What is the difference between Θ(n) and O(n)?
    数学基础之概率统计
    enumerate()函数
  • 原文地址:https://www.cnblogs.com/csgc0131123/p/5290309.html
Copyright © 2011-2022 走看看