标签: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