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 }