码迷,mamicode.com
首页 > 编程语言 > 详细

动态规划算法

时间:2019-12-23 15:00:26      阅读:101      评论:0      收藏:0      [点我收藏+]

标签:int   复杂度   否则   style   有向图   步骤   main   递推   max   

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

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

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

  算法步骤:

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

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

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

 1 #include <stdio.h>
 2 #define N 4
 3 #define MAXINT 1000
 4 int main()
 5 {    
 6     //#ifndef N
 7     int i,j,k;
 8     /* 
 9        1.A数组, 存储顶点之间弧值,对角线值为0,
10        顶点之间存在弧,存弧值,否则弧值MAXINT       
11     */
12     int A[N][N] = {   0,      5,      MAXINT,  7,
13                       MAXINT, 0,      4,       2,
14                       3,      3,      0,       2,
15                       MAXINT, MAXINT, 1,       0    
16                   };
17                   
18     /* 2.D数组\Path数组赋值 */               
19     int D[N][N];    //Vi到Vj的最短路径长度
20     int Path[N][N]; //Vi到Vj的最短路径
21 
22     for(i=0; i<N; ++i)
23     {
24         for(j=0; j<N; ++j)
25         {
26             /* D数组赋值 */
27             D[i][j] = A[i][j]; 
28             /* Path数组赋值 */
29             if(i!=j && A[i][j] < MAXINT) 
30                 Path[i][j] = i;
31             else 
32                 Path[i][j] = -1;
33         }
34     }
35     
36     /* 3.计算最短路径长度及最短路径 */    
37     //加入k顶点的最短路径长度
38     //D[i][j] = min(D[i][j], D[i][k] + D[k][j]);
39     for(k=0; k<N; k++)
40     {
41         for(i=0; i<N; i++)
42         {
43             for(j=0; j<N; ++j)
44             {
45                 if(D[i][k]+D[k][j] < D[i][j]){
46                     D[i][j] = D[i][k] + D[k][j];
47                     Path[i][j] = Path[k][j];
48                 }
49             }
50         }
51     } 
52     //#endif
53     
54     /* 4.打印最短路径长度 */
55     for(i=0; i<N; ++i){
56         for(j=0; j<N; ++j)
57             printf("%5d",D[i][j]);
58         printf("\n");
59     }
60     /* 
61         0  5  8  7
62         6  0  3  2
63         3  3  0  2
64         4  4  1  0
65     */
66     
67     /* 5.打印最短路径路径 */
68     for(i=0; i<N; ++i){
69         for(j=0; j<N; ++j)
70             printf("%5d",Path[i][j]);
71         printf("\n");
72     }
73     /* 
74        -1  0  3  0
75         2 -1  3  1
76         2  2 -1  2
77         2  2  3 -1
78     */
79     return 0;
80 }

动态规划算法

标签:int   复杂度   否则   style   有向图   步骤   main   递推   max   

原文地址:https://www.cnblogs.com/GoldenEllipsis/p/12083621.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!