FLOYD
View Code
1 #include<stdio.h> 2 #define MAXV 100 3 #define INF 32767 4 //#include"graph.h" 5 6 void DispMat(MGraph g) 7 { 8 int i,j; 9 for(i=0;i<g.n;i++) 10 { 11 for(j=0;j<g.n;j++) 12 if(g.edges[i][j]==INF) 13 printf("%3s","∞"); 14 else 15 printf("%3d",g.edges[i][j]); 16 printf("\n"); 17 } 18 } 19 void ppath(int path[][MAXV],int i,int j) 20 { 21 int k; 22 k=path[i][j]; 23 if(k==-1) return; 24 ppath(path,i,k); 25 printf("%d,",k);ppath(path,k,j); 26 } 27 void DisPath(int A[][MAXV],int path[][MAXV],int n) 28 { 29 int i,j; 30 for(i=0;i<n;i++) 31 for(j=0;j<n;j++) 32 if(A[i][j]==INF) 33 { 34 if(i!=j) 35 printf("从%d到%d没有路径"); 36 } 37 else 38 { 39 if(i<j) 40 { 41 printf("从%d到%d的路径为:",i,j); 42 printf("%d,",i); 43 ppath(path,i,j); 44 printf("%d",j); 45 printf("\t路径长度为:%d\n",A[i][j]); 46 } 47 } 48 } 49 void Floyd(MGraph g) 50 { 51 int A[MAXV][MAXV]; 52 int path[MAXV][MAXV]; 53 int i,j,k,n=g.n; 54 for(i=0;i<n;i++) 55 for(j=0;j<n;j++) 56 { 57 A[i][j]=g.edges[i][j]; 58 path[i][j]=-1; 59 } 60 for(k=0;k<n;k++) 61 { 62 for(i=0;i<n;i++) 63 for(j=0;j<n;j++) 64 if(A[i][j]>(A[i][k]+A[k][j])) 65 { 66 A[i][j]=A[i][k]+A[k][j]; 67 path[i][j]=k; 68 } 69 } 70 printf("\n输出最短路径:\n"); 71 DisPath(A,path,n); 72 } 73 void main() 74 { 75 int i,j,u=0; 76 MGraph g; 77 double A[51][51]; 78 for(i=0;i<51;i++) 79 { 80 for(j=0;j<51;j++) 81 { 82 A[i][j]=INF; 83 } 84 } 85 A[0][18]=2182.0; 86 A[0][21]=1796.9; 87 A[0][26]=1392.1; 88 A[1][3]=1916.3; 89 A[1][6]=1294.3; 90 A[1][7]=1968.2; 91 A[1][8]=2.8638e+003; 92 A[2][4]=2.2926e+003; 93 A[2][5]=1.2529e+003; 94 A[2][20]=7.8233e+003; 95 A[3][4]=3.5364e+003; 96 A[3][8]=1.9581e+003; 97 A[5][15]=5.0045e+003; 98 A[7][10]=2.0594e+003; 99 A[7][18]=5.9179e+003; 100 A[8][12]=1.7568e+003; 101 A[9][10]=1.9455e+003; 102 A[9][14]=2.6813e+003; 103 A[10][18]=5.9095e+003; 104 A[11][12]=1.4177e+003; 105 A[11][13]=1.6696e+003; 106 A[12][13]=1.4568e+003; 107 A[12][15]=4.8058e+003; 108 A[12][25]=5.7566e+003; 109 A[13][18]=3.1135e+003; 110 A[13][19]=3.4557e+003; 111 A[14][16]=2.6077e+003; 112 A[14][17]=2.1957e+003; 113 A[14][18]=5.3422e+003; 114 A[14][21]=3.2967e+003; 115 A[15][22]=2.8610e+003; 116 A[15][25]=4.2354e+003; 117 A[16][23]=2.0976e+003; 118 A[17][21]=1.8239e+003; 119 A[17][23]=1.7745e+003; 120 A[18][31]=2.1037e+003; 121 A[19][24]=2.2586e+003; 122 A[19][25]=1.9662e+003; 123 A[20][22]=1.4989e+003; 124 A[21][26]=2.1917e+003; 125 A[21][36]=2.8802e+003; 126 A[22][29]=1.0979e+003; 127 A[22][30]=1.2875e+003; 128 A[23][32]=1.3119e+003; 129 A[24][31]=1.7801e+003; 130 A[25][29]=1.8859e+003; 131 A[25][41]=4.1546e+003; 132 A[26][31]=1.5370e+003; 133 A[27][31]=1.0678e+003; 134 A[27][36]=2.2039e+003; 135 A[27][39]=1.7799e+003; 136 A[28][30]=1.0179e+003; 137 A[28][33]=1.3257e+003; 138 A[30][41]=4.9976e+003; 139 A[31][34]=2.3247e+003; 140 A[32][35]=1.1140e+003; 141 A[33][46]=3.7585e+003; 142 A[34][40]=1.6308e+003; 143 A[35][38]=1.4097e+003; 144 A[36][38]=1.5374e+003; 145 A[36][45]=3.1825e+003; 146 A[37][40]=2.0901e+003; 147 A[37][41]=2.6019e+003; 148 A[38][43]=2.6184e+003; 149 A[40][45]=3.2170e+003; 150 A[40][47]=2.3312e+003; 151 A[40][50]=3.0435e+003; 152 A[41][44]=2.3660e+003; 153 A[41][46]=2.7354e+003; 154 A[42][43]=917.6737; 155 A[42][45]=2.3517e+003; 156 A[42][49]=1.9714e+003; 157 A[44][48]=2.1525e+003; 158 A[44][50]=4.9870e+003; 159 A[45][50]=3.1028e+003; 160 A[46][48]=1.4941e+003; 161 A[49][50]=3.5688e+003; 162 for(i=0;i<51;i++) 163 { 164 for(j=0;j<51;j++) 165 { 166 if(A[i][j]!=0) 167 A[j][i]=A[i][j]; 168 } 169 } 170 g.n=51; 171 g.e=154; 172 for(i=0;i<g.n;i++) 173 for(j=0;j<g.n;j++) 174 g.edges[i][j]=A[i][j]; 175 printf("\n"); 176 printf("图G的邻接矩阵:\n"); 177 DispMat(g); 178 Floyd(g); 179 printf("\n"); 180 }