zoukankan      html  css  js  c++  java
  • 动态规划算法

    一、斐波那契数列(递推思想,动态规划算法)

    二、多源最短路径(给定带权有向图(G = (V,E)),求任意两顶点(Vi,Vj)之间的最短路径)

      弗洛伊德算法(Floyd),动态规划思想,算法复杂度大O(N的三次方)。

      算法步骤:

      1、先定义一个n阶的矩阵,令其对角线的值为0,若存在弧,则对应元素为弧值,否则为无穷大

      2、逐步在原直接路径中增加中间顶点,若加入中间顶点后,路径变短,则修改之,否则维持

      3、所有顶点试探完毕,算法结束。

      1 #include <stdio.h>
      2 #include<stack>
      3 #define N 4
      4 #define MAXINT 1000
      5 int main()
      6 {    
      7     //#ifndef N
      8     int i,j,k;
      9     /* 
     10        1.A数组, 存储顶点之间弧值,对角线值为0,
     11        顶点之间存在弧,存弧值,否则弧值MAXINT       
     12     */
     13     int A[N][N] = {   0,      5,      MAXINT,  7,
     14                       MAXINT, 0,      4,       2,
     15                       3,      3,      0,       2,
     16                       MAXINT, MAXINT, 1,       0    
     17                   };
     18                   
     19     /* 2.D数组Path数组赋值 */               
     20     int D[N][N];    //Vi到Vj的最短路径长度
     21     int Path[N][N]; //Vi到Vj的最短路径
     22 
     23     for(i=0; i<N; ++i)
     24     {
     25         for(j=0; j<N; ++j)
     26         {
     27             /* D数组赋值 */
     28             D[i][j] = A[i][j]; 
     29             /* Path数组赋值 */
     30             if(i!=j && A[i][j] < MAXINT) 
     31                 Path[i][j] = i;
     32             else 
     33                 Path[i][j] = -1;
     34         }
     35     }
     36     
     37     /* 3.计算最短路径长度及最短路径 */    
     38     //加入k顶点的最短路径长度
     39     //D[i][j] = min(D[i][j], D[i][k] + D[k][j]);
     40     for(k=0; k<N; k++)
     41     {
     42         for(i=0; i<N; i++)
     43         {
     44             for(j=0; j<N; ++j)
     45             {
     46                 if(D[i][k]+D[k][j] < D[i][j]){
     47                     D[i][j] = D[i][k] + D[k][j];
     48                     Path[i][j] = Path[k][j];
     49                 }
     50             }
     51         }
     52     } 
     53     //#endif
     54     
     55     /* 4.打印最短路径长度 */
     56     for(i=0; i<N; ++i){
     57         for(j=0; j<N; ++j)
     58             printf("%5d",D[i][j]);
     59         printf("
    ");
     60     }
     61     printf("
    ");
     62     /* 
     63         0  5  8  7
     64         6  0  3  2
     65         3  3  0  2
     66         4  4  1  0
     67     */
     68     
     69     /* 5.打印最短路径路径 */
     70     for(i=0; i<N; ++i){
     71         for(j=0; j<N; ++j)
     72             printf("%5d",Path[i][j]);
     73         printf("
    ");
     74     }
     75     printf("
    ");
     76     /* 
     77        -1  0  3  0
     78         2 -1  3  1
     79         2  2 -1  2
     80         2  2  3 -1
     81     */
     82     
     83     /* 6.打印顶点1到顶点0的最短路径 */
     84     int v1 = 1,v0 = 0;
     85     
     86     /* int arr[N] = {v0}, index = 1;
     87     while(Path[v1][v0] != -1){
     88         arr[index++] = v0 = Path[v1][v0];        
     89     }
     90         
     91     for(int i=index-1; i>=0; --i){
     92         if(i != index-1) printf(" ->");
     93         printf(" %d",arr[i]);
     94     }*/
     95     /* 1 -> 3 -> 2 -> 0 */
     96         
     97     printf("%5d",v0);
     98     while(Path[v1][v0] != -1)
     99     {
    100         printf(" <- %d",Path[v1][v0]);
    101         v0 = Path[v1][v0];    
    102     }
    103     printf("
    "); 
    104     /* 0 <- 2 <- 3 <- 1 */    
    105     return 0;
    106 }
  • 相关阅读:
    Google Protocol Buffer 的使用和原理(转)
    在python开发工具PyCharm中搭建QtPy环境(详细)
    Docker容器的操作
    Docker镜像操作
    最新版本Docker的安装和使用
    linux CentOS如何安装KVM
    在Linux CentOS下如何安装tar.gz和RPM软件包
    Linux忘记root密码后如何在grub界面中以单用户模式进入系统并重置密码的方法
    Django中的Project和App的区别
    Python处理PDF和Word文档常用的方法(二)
  • 原文地址:https://www.cnblogs.com/GoldenEllipsis/p/12083621.html
Copyright © 2011-2022 走看看