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 "); 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 DijkstraShortestPath(struct _Graph *DirectedGraph,char *Origin,char *Destination) 133 { 134 int Visit[DirectedGraph->VertexNum]; 135 int Distance[DirectedGraph->VertexNum]; 136 int PathResult[DirectedGraph->VertexNum]; 137 int OIndex = VertexName2Index(DirectedGraph,Origin); 138 int DIndex = VertexName2Index(DirectedGraph,Destination); 139 memset(Visit,0,sizeof(Visit)); 140 memset(PathResult,0,sizeof(PathResult)); 141 int i,j; 142 for(i = 0; i < DirectedGraph->VertexNum; i ++) 143 { 144 Distance[i] = INT_MAX; 145 PathResult[i] = OIndex; 146 } 147 148 struct VertexBodyNode *TmpPointer; 149 150 TmpPointer = DirectedGraph -> VertexHeadNodeList[OIndex].Next; 151 while(TmpPointer != NULL) 152 { 153 Distance[TmpPointer->VertexIndex] = TmpPointer -> ArcWeight; 154 TmpPointer = TmpPointer -> Next; 155 } 156 157 int MinCost; 158 int MinCostIndex = OIndex; 159 for(i = 0;i < DirectedGraph->VertexNum-1;i ++) 160 { 161 MinCost = INT_MAX; 162 163 for(j = 0;j < DirectedGraph->VertexNum;j ++) 164 { 165 if(Visit[j]==0 && Distance[j]<MinCost) 166 { 167 MinCostIndex = j; 168 MinCost = Distance[j]; 169 } 170 } 171 172 Visit[MinCostIndex] = 1; 173 174 TmpPointer = DirectedGraph -> VertexHeadNodeList[MinCostIndex].Next; 175 while(TmpPointer != NULL) 176 { 177 if(Visit[TmpPointer->VertexIndex]==0 178 && MinCost+TmpPointer->ArcWeight<Distance[TmpPointer->VertexIndex]) 179 { 180 Distance[TmpPointer->VertexIndex] = MinCost+TmpPointer->ArcWeight; 181 PathResult[TmpPointer->VertexIndex] = MinCostIndex; 182 } 183 TmpPointer = TmpPointer -> Next; 184 } 185 } 186 187 int TmpSearchIndex = DIndex; 188 while(TmpSearchIndex != OIndex) 189 { 190 printf("%s <- ",DirectedGraph->VertexHeadNodeList[TmpSearchIndex].VertexName); 191 TmpSearchIndex = PathResult[TmpSearchIndex]; 192 } 193 if(DIndex != OIndex) 194 printf("%s Distance:%d ",DirectedGraph->VertexHeadNodeList[OIndex].VertexName,Distance[DIndex]); 195 else 196 printf("%s Distance:%d ",DirectedGraph->VertexHeadNodeList[OIndex].VertexName,0); 197 } 198 199 int main() 200 { 201 struct _Graph *G = UGCreat(8,5); 202 203 // Travel(G); 204 char Origin[MaxVertexNodeNameSize]; 205 char Destination[MaxVertexNodeNameSize]; 206 printf("Input Origin && Destination: "); 207 scanf("%s %s",Origin,Destination); 208 DijkstraShortestPath(G,Origin,Destination); 209 return 0; 210 } 211 212 /* 213 beijing 18 214 zhengzhou 10 215 hefei 9 216 nanjing 12 217 guangzhou 14 218 beijing zhengzhou 7 219 beijing hefei 9 220 beijing nanjing 8 221 zhengzhou hefei 5 222 hefei nanjing 3 223 zhengzhou guangzhou 7 224 hefei guangzhou 8 225 nanjing guangzhou 6 226 */