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