• 动态规划解决分层图最短路径问题


    问题描述,如图所示的
    解决该问题从节点1-->节点8的最短路径以及其最短距离.


    利用动态规划的思想:
    1、将图进行分层,如图所示的路径中可以分为4层,第一层为1,第二层为3/5/6,第三层为2/4/7,第四层为8
    2、从终点开始向起点进行回溯,首先看第三层各元素到节点8的最短距离,然后计算第二层到节点8的最短距离是采用第二层到第三层个节点的距离加上第二层各节点到节点8的距离最短值
    3、最终回溯到起点结束,动态规划完成。
    具体实现代码如下:


    
    

       
    
    
    #include<stdio.h>
    #include<string.h>
    char element[100][100];     //储存位置的元素信息 
    int distant[100][100][100];  //储存该位置到下一层各元素的距离 
    int min[100][100][100];     //动态规划中的最小距离 
    int elementnum1[100];       //每一层的元素个数 
    int main(void)
    {
     char terminal;
     int layernum = 0,elementnum = 0; 
     int i = 0,j = 0,k = 0,l = 0;
     int m=0,t=0;
     int minlocate=0;
     for(i=0;i<10;i++)
      for(j=0;j<10;j++)
       for(k=0;k<10;k++)
       {
        min[i][j][k]=0;
        distant[i][j][k]=10000;
       }
     printf("欢迎使用最短路径动态规划系统
    ");
     // -------------图的构造部分-------------- 
     printf("本次规划共有层数:");
     scanf("%d",&layernum);
     for(i=0;i<layernum;i++)
     {
      printf("请输入第%d层元素个数:",i+1);
      scanf("%d",&elementnum);
      elementnum1[i]=elementnum;
      for(j=0;j<elementnum;j++)
      {
       printf("请输入第%d个元素:",j+1);
       scanf(" %c",&element[i][j]);
       printf("请输入该元素与后一层的连接关系个数:");
       scanf("%d",&m);
       for(l=0;l<m;l++)
       {
        printf("请输入该元素与后一层的连接关系(例如输入1,2则表示与后一层的第1个元素的距离为2):");
        scanf("%d",&k);
        scanf("%d",&distant[i][j][k-1]);
       }
      } 
     }
     
     printf("请输入终点:");
     scanf(" %c",&terminal); 
     for(j=elementnum-1;j>=0;j--)
     {
      if(terminal==element[layernum-1][j])
       break;
     }
     if(j<0)
      printf("该元素不能作为终点!");
     minlocate=j;
     //------------------动态规划部分--------------------- 
     
     
     for(i=layernum-1;i>=0;i--)     //倒叙运算方式,从终点开始回溯 
     {
      for(j=0;j<elementnum1[i];j++)
      {
       if(terminal==element[i][j]) 
        min[i][j][minlocate]=0;
       else
        min[i][j][minlocate]=10000;
       for(k=0;k<elementnum1[i+1];k++)
       {
        
        t = distant[i][j][k]+min[i+1][k][minlocate];  //核心算法:此点到终点的最短距离等于此点到后一层的距离加上后一层到终点的距离 
        if(t<min[i][j][minlocate])
        {
         min[i][j][minlocate] = t;
         
        }
       }
       printf("元素%c到终点的最短路径为%d
    ",element[i][j],min[i][j][minlocate]);
       
      }
      
     }
     
     return 0;
    } 
    
    
    
                                        
    
  • 相关阅读:
    Kettle 实现mysql数据库不同表之间数据同步——实验过程
    Kettle ETL 来进行mysql 数据同步——试验环境搭建(表中无索引,无约束,无外键连接的情况)
    并查集知识总结
    c# 线程同步问题(about volatile)
    c# 线程的等待(堵塞)
    net中多线程返回值
    c# 中的 lock monitor mutex Semaphore 的比较
    c#两种同步结构
    links-some-blog
    T-SQL中的APPLY用法
  • 原文地址:https://www.cnblogs.com/liumantang/p/11830400.html
Copyright © 2020-2023  润新知