1 #include <iostream>
2 using namespace std ;
3
4 #define MAXVERTEXNUM 100
5 struct Graph
6 {
7 int VertexNum ;
8 char Vertex[MAXVERTEXNUM] ;
9 int AdjMatrix[MAXVERTEXNUM][MAXVERTEXNUM] ;
10 } ;
11
12 Graph MGraph ;
13
14
15 #define INFINITY 100
16 void CreateGraph (Graph *G)
17 {
18 int i , j ;
19
20 cin >> G-> VertexNum ;
21 for (i = 1 ; i <= G->VertexNum ; i++)
22 {
23 cin >> G->Vertex[i] ;
24 }
25 for (i = 1 ; i <= G->VertexNum ; i++)
26 {
27 for (j = 1 ; j <= G->VertexNum ; j++)
28 {
29 cin >> G->AdjMatrix[i][j] ;
30 if (G->AdjMatrix[i][j] == -1)
31 {
32 G->AdjMatrix[i][j] = INFINITY ;
33 }
34 }
35 }
36 }
37
38
39 void ShowGraph (Graph *G)
40 {
41 int i , j ;
42
43 for (i = 1 ; i <= G->VertexNum ; i++)
44 {
45 cout << G->Vertex[i] << " " ;
46 }
47 cout << endl ;
48
49 for (i = 1 ; i <= G->VertexNum ; i++)
50 {
51 for (j = 1 ; j <= G->VertexNum ; j++)
52 {
53 cout << G->AdjMatrix[i][j] << " " ;
54 }
55 cout << endl ;
56 }
57 }
58
59 char Path[MAXVERTEXNUM][MAXVERTEXNUM] ;
60 int Dest[MAXVERTEXNUM] ;
61 void ShortestPath (Graph *G , char StartVexChar)
62 {
63 int i , j , m , StartVex , CurrentVex , MinDest ;
64 int Final[MAXVERTEXNUM] ;
65
66
67 for (i = 1 ; j <= G->VertexNum ; i++)
68 {
69 if (G->Vertex[i] == StartVexChar)
70 {
71 StartVex = i ;
72 break ;
73 }
74 }
75
76 for (i = 1 ; i <= G->VertexNum ; i++)
77 {
78 Path[i][0] = 0 ;
79 Dest[i] = INFINITY ;
80 if (G->AdjMatrix[StartVex][i] < INFINITY)
81 {
82 Dest[i] = G->AdjMatrix[StartVex][i] ;
83 Path[i][1] = G->Vertex[StartVex] ;
84 Path[i][2] = G->Vertex[i] ;
85 Path[i][0] = 2 ;
86 }
87 Final[i] = 'F' ;
88 }
89 Dest[StartVex] = 0 ;
90 Final[StartVex] = 'T' ;
91 for (i = 1 ; i <= G->VertexNum ; i++)
92 {
93 MinDest = INFINITY ;
94 for (j = 1 ; j <= G->VertexNum ; j++)
95 {
96 if (Final[j] == 'F')
97 {
98 if (Dest[j] < MinDest)
99 {
100 CurrentVex = j ;
101 MinDest = Dest[j] ;
102 }
103 }
104 }
105 Final[CurrentVex] = 'T' ;
106 for (j = 1 ; j <= G->VertexNum ; j++)
107 {
108 if ((Final[j] == 'F') && (MinDest + G->AdjMatrix[CurrentVex][j] < Dest[j]))
109 {
110 Dest[j] = MinDest + G->AdjMatrix[CurrentVex][j] ;
111
112 for (m = 0 ; m <= Path[CurrentVex][0] ; m++)
113 {
114 Path[j][m] = Path[CurrentVex][m] ;
115 }
116 Path[j][0]++ ;
117 Path[j][Path[j][0]] = G->Vertex[j] ;
118 }
119 }
120 }
121 }
122
123 void ShowPath (Graph *G)
124 {
125 int i , j ;
126
127 for (i = 1 ; i <= G->VertexNum ; i++)
128 {
129 cout << G->Vertex[i] << "(" << Dest[i] << ") : " ;
130 if (Path[i][0] > 0)
131 {
132 for (j = 1 ; j < G->VertexNum ; j++)
133 {
134 cout << " " << Path[i][j] ;
135 }
136 }
137 cout << endl ;
138 }
139 }
140
141 int main ()
142 {
143 char StartVex ;
144
145 CreateGraph (&MGraph) ;
146 ShowGraph (&MGraph) ;
147
148 cin >> StartVex ;
149 ShortestPath (&MGraph , StartVex) ;
150 ShowPath (&MGraph) ;
151
152 return 0 ;
153
154 }
原文链接: https://www.cnblogs.com/maoguy/p/6049299.html
欢迎关注
微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍
原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/243643
非原创文章文中已经注明原地址,如有侵权,联系删除
关注公众号【高性能架构探索】,第一时间获取最新文章
转载文章受原作者版权保护。转载请注明原作者出处!