1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <string.h>
4 #include <stdbool.h>
5
6 #define MaxVertexNodeNumSize 1000
7 #define MaxVertexNodeNameSize 100
8 #define INFINITY 10000
9
10 struct VertexBodyNode
11 {
12 char VertexName[MaxVertexNodeNameSize];
13 int ArcWeight;
14 int VertexIndex;
15 struct VertexBodyNode *Next;
16 };
17
18 struct VertexHeadNode
19 {
20 char VertexName[MaxVertexNodeNameSize];
21 int VertexWeight;
22 struct VertexBodyNode *Next;
23 };
24
25 struct _Graph
26 {
27 struct VertexHeadNode VertexHeadNodeList[MaxVertexNodeNumSize];
28 int ArcNum,VertexNum;
29 };
30
31 int VertexName2Index(struct _Graph *DirectedGraph,char *VName)
32 {
33 int i;
34 for(i = 0; i < DirectedGraph -> VertexNum; i ++)
35 {
36 if(strcmp(DirectedGraph -> VertexHeadNodeList[i].VertexName,VName)==0)
37 {
38 return i;
39 }
40 }
41 return -1;
42 }
43
44 void AddOneArc(struct _Graph *DirectedGraph,int ArcIndex_1,int ArcIndex_2,int AWeight)
45 {
46 struct VertexBodyNode *BNode = malloc(sizeof(struct VertexBodyNode));
47
48 strcpy(BNode -> VertexName,DirectedGraph -> VertexHeadNodeList[ArcIndex_2].VertexName);
49
50 BNode -> ArcWeight = AWeight;
51 BNode -> VertexIndex = ArcIndex_2;
52 BNode -> Next = NULL;
53
54 struct VertexBodyNode *TmpPointer;
55 TmpPointer = DirectedGraph -> VertexHeadNodeList[ArcIndex_1].Next;
56 while(TmpPointer != NULL && TmpPointer -> Next != NULL)
57 {
58 TmpPointer = TmpPointer -> Next;
59 }
60 if(TmpPointer==NULL)
61 {
62 DirectedGraph -> VertexHeadNodeList[ArcIndex_1].Next = BNode;
63 }
64 else
65 {
66 TmpPointer -> Next = BNode;
67 }
68 }
69
70 struct _Graph *UGCreat(int ArcSum,int VertexSum)
71 {
72 int i,j;
73 struct _Graph *DirectedGraph = malloc(sizeof(struct _Graph));
74 DirectedGraph -> ArcNum = ArcSum;
75 DirectedGraph -> VertexNum = VertexSum;
76
77 for(i = 0; i < VertexSum; i ++)
78 {
79 scanf("%s %d",DirectedGraph -> VertexHeadNodeList[i].VertexName,&DirectedGraph -> VertexHeadNodeList[i].VertexWeight);
80 }
81
82 for(i = 0; i < VertexSum; i ++)
83 {
84 DirectedGraph -> VertexHeadNodeList[i].Next = NULL;
85 }
86
87 for(i = 0; i < ArcSum; i ++)
88 {
89 char Arc_1[MaxVertexNodeNameSize];
90 char Arc_2[MaxVertexNodeNameSize];
91 int ArcIndex_1;
92 int ArcIndex_2;
93 int ArcWeight;
94
95 scanf("%s %s %d",Arc_1,Arc_2,&ArcWeight);
96
97 ArcIndex_1 = VertexName2Index(DirectedGraph,Arc_1);
98 ArcIndex_2 = VertexName2Index(DirectedGraph,Arc_2);
99
100 AddOneArc(DirectedGraph,ArcIndex_1,ArcIndex_2,ArcWeight);
101 }
102 return DirectedGraph;
103 }
104
105 void Travel(struct _Graph *DirectedGraph)
106 {
107 char StartingPoint[MaxVertexNodeNameSize];
108 char OverPoint[MaxVertexNodeNameSize];
109
110 printf("Input start and over\n");
111 scanf("%s %s",StartingPoint,OverPoint);
112
113 int StartIndex = VertexName2Index(DirectedGraph,StartingPoint);
114 int OverIndex = VertexName2Index(DirectedGraph,OverPoint);
115
116 struct VertexBodyNode *TmpPointer;
117 TmpPointer = DirectedGraph -> VertexHeadNodeList[StartIndex].Next;
118 while(TmpPointer != NULL)
119 {
120 if(OverIndex==TmpPointer -> VertexIndex)
121 {
122 printf("Distance:%d GetVertexPointSum:%d",TmpPointer->ArcWeight
123 ,DirectedGraph -> VertexHeadNodeList[StartIndex].VertexWeight+DirectedGraph -> VertexHeadNodeList[OverIndex].VertexWeight);
124 break;
125 }
126 else
127 {
128 TmpPointer = TmpPointer -> Next;
129 }
130 }
131 }
132
133 void FloydShortestPath(struct _Graph *DirectedGraph,char *Origin,char *Destination)
134 {
135 int OIndex = VertexName2Index(DirectedGraph,Origin);
136 int DIndex = VertexName2Index(DirectedGraph,Destination);
137
138 int i,j,k;
139 struct VertexBodyNode *TmpPointer;
140 int A[DirectedGraph->VertexNum][DirectedGraph->VertexNum];
141 int Path[DirectedGraph->VertexNum][DirectedGraph->VertexNum];
142 for(i = 0;i < DirectedGraph->VertexNum;i ++)
143 {
144 for(j = 0;j < DirectedGraph->VertexNum;j ++)
145 {
146 A[i][j] = INFINITY;
147 if(i == j)
148 {
149 A[i][j] = 0;
150 }
151 Path[i][j] = j;
152 }
153 }
154 for(i = 0;i < DirectedGraph->VertexNum;i ++)
155 {
156 TmpPointer = DirectedGraph -> VertexHeadNodeList[i].Next;
157 while(TmpPointer != NULL)
158 {
159 A[i][TmpPointer->VertexIndex] = TmpPointer -> ArcWeight;
160 TmpPointer = TmpPointer -> Next;
161 }
162 }
163
164 for(i = 0;i < DirectedGraph->VertexNum;i ++)
165 {
166 for(j = 0;j < DirectedGraph->VertexNum;j ++)
167 {
168 for(k = 0;k < DirectedGraph->VertexNum;k ++)
169 {
170 if(A[j][k]>A[j][i]+A[i][k])
171 {
172 A[j][k] = A[j][i]+A[i][k];
173 Path[j][k] = Path[j][i];
174 }
175 }
176 }
177 }
178
179 int TmpIndex = Path[OIndex][DIndex];
180 printf("%s -> ",DirectedGraph->VertexHeadNodeList[OIndex].VertexName);
181 while(TmpIndex != DIndex)
182 {
183 printf("%s -> ",DirectedGraph->VertexHeadNodeList[TmpIndex].VertexName);
184 TmpIndex = Path[TmpIndex][DIndex];
185 }
186 printf("%s Distance:%d",DirectedGraph->VertexHeadNodeList[DIndex].VertexName,A[OIndex][DIndex]);
187 }
188
189 int main()
190 {
191 struct _Graph *G = UGCreat(8,5);
192
193 // Travel(G);
194 char Origin[MaxVertexNodeNameSize];
195 char Destination[MaxVertexNodeNameSize];
196 printf("Input Origin && Destination:\n");
197 scanf("%s %s",Origin,Destination);
198 FloydShortestPath(G,Origin,Destination);
199 return 0;
200 }
201
202 /*
203 beijing 18
204 zhengzhou 10
205 hefei 9
206 nanjing 12
207 guangzhou 14
208 beijing zhengzhou 7
209 beijing hefei 9
210 beijing nanjing 8
211 zhengzhou hefei 5
212 hefei nanjing 3
213 zhengzhou guangzhou 7
214 hefei guangzhou 8
215 nanjing guangzhou 6
216 */