1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <string.h>
4 #include <stdbool.h>
5
6 #define INFINITY 0x3f3f3f3f
7 #define MaxVertexNodeNumSize 1000
8 #define MaxVertexNodeNameSize 100
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 *UnsignedGraph,char *VName)
32 {
33 int i;
34 for(i = 0; i < UnsignedGraph -> VertexNum; i ++)
35 {
36 if(strcmp(UnsignedGraph -> VertexHeadNodeList[i].VertexName,VName)==0)
37 {
38 return i;
39 }
40 }
41 return -1;
42 }
43
44 void AddOneArc(struct _Graph *UnsignedGraph,int ArcIndex_1,int ArcIndex_2,int AWeight)
45 {
46 struct VertexBodyNode *BNode_1 = malloc(sizeof(struct VertexBodyNode));
47 struct VertexBodyNode *BNode_2 = malloc(sizeof(struct VertexBodyNode));
48
49 strcpy(BNode_1 -> VertexName,UnsignedGraph -> VertexHeadNodeList[ArcIndex_1].VertexName);
50 strcpy(BNode_2 -> VertexName,UnsignedGraph -> VertexHeadNodeList[ArcIndex_2].VertexName);
51 BNode_1 -> ArcWeight = AWeight;
52 BNode_2 -> ArcWeight = AWeight;
53 BNode_1 -> VertexIndex = ArcIndex_1;
54 BNode_2 -> VertexIndex = ArcIndex_2;
55 BNode_1 -> Next = BNode_2 -> Next = NULL;
56
57 struct VertexBodyNode *TmpPointer;
58 TmpPointer = UnsignedGraph -> VertexHeadNodeList[ArcIndex_1].Next;
59 while(TmpPointer != NULL && TmpPointer -> Next != NULL)
60 {
61 TmpPointer = TmpPointer -> Next;
62 }
63 if(TmpPointer==NULL)
64 {
65 UnsignedGraph -> VertexHeadNodeList[ArcIndex_1].Next = BNode_2;
66 }
67 else
68 {
69 TmpPointer -> Next = BNode_2;
70 }
71
72 TmpPointer = UnsignedGraph -> VertexHeadNodeList[ArcIndex_2].Next;
73 while(TmpPointer != NULL && TmpPointer -> Next != NULL)
74 {
75 TmpPointer = TmpPointer -> Next;
76 }
77 if(TmpPointer==NULL)
78 {
79 UnsignedGraph -> VertexHeadNodeList[ArcIndex_2].Next = BNode_1;
80 }
81 else
82 {
83 TmpPointer -> Next = BNode_1;
84 }
85 }
86
87 void DeleteOneArc(struct _Graph *UnsignedGraph,int ArcIndex_1,int ArcIndex_2)
88 {
89 struct VertexBodyNode *TmpPointer_1,*TmpPointer_2;
90
91 TmpPointer_1 = UnsignedGraph -> VertexHeadNodeList[ArcIndex_1].Next;
92 TmpPointer_2 = UnsignedGraph -> VertexHeadNodeList[ArcIndex_1].Next;
93
94 while(TmpPointer_2!=NULL && TmpPointer_2->VertexIndex!=ArcIndex_2)
95 {
96 TmpPointer_1 = TmpPointer_2;
97 TmpPointer_2 = TmpPointer_2 -> Next;
98 }
99
100 if(TmpPointer_2==NULL)
101 {
102 return ;
103 }
104 else if(TmpPointer_1 == TmpPointer_2)
105 {
106 UnsignedGraph -> VertexHeadNodeList[ArcIndex_1].Next = NULL;
107 free(TmpPointer_2);
108 }
109 else
110 {
111 TmpPointer_1 -> Next = TmpPointer_2 -> Next;
112 free(TmpPointer_2);
113 }
114
115 TmpPointer_1 = UnsignedGraph -> VertexHeadNodeList[ArcIndex_2].Next;
116 TmpPointer_2 = UnsignedGraph -> VertexHeadNodeList[ArcIndex_2].Next;
117
118 while(TmpPointer_2!=NULL && TmpPointer_2->VertexIndex!=ArcIndex_1)
119 {
120 TmpPointer_1 = TmpPointer_2;
121 TmpPointer_2 = TmpPointer_2 -> Next;
122 }
123
124 if(TmpPointer_2==NULL)
125 {
126 return ;
127 }
128 else if(TmpPointer_1 == TmpPointer_2)
129 {
130 UnsignedGraph -> VertexHeadNodeList[ArcIndex_2].Next = NULL;
131 free(TmpPointer_2);
132 }
133 else
134 {
135 TmpPointer_1 -> Next = TmpPointer_2 -> Next;
136 free(TmpPointer_2);
137 }
138 }
139
140 struct _Graph *UGCreat(int ArcSum,int VertexSum)
141 {
142 int i,j;
143 struct _Graph *UnsignedGraph = malloc(sizeof(struct _Graph));
144 UnsignedGraph -> ArcNum = ArcSum;
145 UnsignedGraph -> VertexNum = VertexSum;
146
147 for(i = 0; i < VertexSum; i ++)
148 {
149 scanf("%s %d",UnsignedGraph -> VertexHeadNodeList[i].VertexName,&UnsignedGraph -> VertexHeadNodeList[i].VertexWeight);
150 }
151
152 for(i = 0; i < VertexSum; i ++)
153 {
154 UnsignedGraph -> VertexHeadNodeList[i].Next = NULL;
155 }
156
157 for(i = 0; i < ArcSum; i ++)
158 {
159 char Arc_1[MaxVertexNodeNameSize];
160 char Arc_2[MaxVertexNodeNameSize];
161 int ArcIndex_1;
162 int ArcIndex_2;
163 int ArcWeight;
164
165 scanf("%s %s %d",Arc_1,Arc_2,&ArcWeight);
166
167 ArcIndex_1 = VertexName2Index(UnsignedGraph,Arc_1);
168 ArcIndex_2 = VertexName2Index(UnsignedGraph,Arc_2);
169
170 AddOneArc(UnsignedGraph,ArcIndex_1,ArcIndex_2,ArcWeight);
171 }
172 return UnsignedGraph;
173 }
174
175 void Travel(struct _Graph *UnsignedGraph)
176 {
177 char StartingPoint[MaxVertexNodeNameSize];
178 char OverPoint[MaxVertexNodeNameSize];
179
180 printf("Input start and over\n");
181 scanf("%s %s",StartingPoint,OverPoint);
182
183 int StartIndex = VertexName2Index(UnsignedGraph,StartingPoint);
184 int OverIndex = VertexName2Index(UnsignedGraph,OverPoint);
185
186 struct VertexBodyNode *TmpPointer;
187 TmpPointer = UnsignedGraph -> VertexHeadNodeList[StartIndex].Next;
188 while(TmpPointer != NULL && TmpPointer -> Next != NULL)
189 {
190 if(OverIndex==TmpPointer -> VertexIndex)
191 {
192 printf("Distance:%d GetVertexPointSum:%d",TmpPointer->ArcWeight
193 ,UnsignedGraph -> VertexHeadNodeList[StartIndex].VertexWeight+UnsignedGraph -> VertexHeadNodeList[OverIndex].VertexWeight);
194 break;
195 }
196 else
197 {
198 TmpPointer = TmpPointer -> Next;
199 }
200 }
201 }
202
203 void PrimMST(struct _Graph *UnsignedGraph)
204 {
205 int i;
206 int ResultTail[UnsignedGraph->VertexNum];
207 int ResultWeight[UnsignedGraph->VertexNum];
208 int Visit[UnsignedGraph->VertexNum];
209 int OtherWeight[UnsignedGraph->VertexNum];
210 int ResultTailEnd;
211 int ResultWeightEnd;
212 memset(OtherWeight,0x3f,sizeof(OtherWeight));
213 memset(Visit,0,sizeof(Visit));
214
215 struct VertexBodyNode *TmpPointer;
216 TmpPointer = UnsignedGraph -> VertexHeadNodeList[0].Next;
217 ResultTail[ResultTailEnd++] = 0;
218 while(TmpPointer != NULL)
219 {
220 OtherWeight[TmpPointer->VertexIndex] = TmpPointer -> ArcWeight;
221 TmpPointer = TmpPointer -> Next;
222 }
223
224 for(i = 1; i < UnsignedGraph->VertexNum; i ++)
225 {
226 int TmpIndex = 0;
227 int WeightMin;
228 int WeightMinIndex = 0;
229 WeightMin = INFINITY;
230
231 while(TmpIndex < UnsignedGraph->VertexNum)
232 {
233 if(Visit[TmpIndex]==0 && OtherWeight[TmpIndex]<WeightMin)
234 {
235 WeightMin = OtherWeight[TmpIndex];
236 WeightMinIndex = TmpIndex;
237 }
238 TmpIndex ++;
239 }
240
241 ResultTail[ResultTailEnd++] = WeightMinIndex;
242 ResultWeight[ResultWeightEnd++] = WeightMin;
243 Visit[WeightMinIndex] = 1;
244
245 //update
246 TmpPointer = UnsignedGraph -> VertexHeadNodeList[WeightMinIndex].Next;
247 while(TmpPointer != NULL)
248 {
249 if(Visit[TmpPointer->VertexIndex]==0 && TmpPointer->ArcWeight<OtherWeight[TmpPointer->VertexIndex])
250 {
251 OtherWeight[TmpPointer->VertexIndex] = TmpPointer->ArcWeight;
252 }
253 TmpPointer = TmpPointer -> Next;
254 }
255 }
256
257 for(i = 0;i < ResultTailEnd-1;i ++)
258 {
259 TmpPointer = UnsignedGraph -> VertexHeadNodeList[ResultTail[i+1]].Next;
260 while(TmpPointer != NULL)
261 {
262 if(TmpPointer->ArcWeight==ResultWeight[i])
263 {
264 printf("%s ¡ª¡ª%s Distance:%d\n",UnsignedGraph->VertexHeadNodeList[ResultTail[i+1]].VertexName
265 ,UnsignedGraph->VertexHeadNodeList[TmpPointer->VertexIndex].VertexName
266 ,ResultWeight[i]);
267 break;
268 }
269 TmpPointer = TmpPointer -> Next;
270 }
271 }
272 }
273
274 int main()
275 {
276 struct _Graph *G = UGCreat(8,5);
277 PrimMST(G);
278 // Travel(G);
279 return 0;
280 }
281
282 /*
283 beijing 18
284 zhengzhou 10
285 hefei 9
286 nanjing 12
287 guangzhou 14
288 beijing zhengzhou 7
289 beijing hefei 9
290 beijing nanjing 8
291 zhengzhou hefei 5
292 hefei nanjing 3
293 zhengzhou guangzhou 7
294 hefei guangzhou 8
295 nanjing guangzhou 6
296 */