数据结构——图的邻接矩阵的深度优先搜索

《数据结构——图的邻接矩阵的深度优先搜索》
《数据结构——图的邻接矩阵的深度优先搜索》
代码

   
    
     1 
    #include
2   < iostream >
3
4 using
5 namespace
6 std;
7
8
9 #define
10 MAX_VERTEX_NUM
11 10 // 最大顶点个数
12
13
14 typedef char
15 VERTYPE;
16
17 typedef struct
18
19
20 {
21
22 VERTYPE vexs[MAX_VERTEX_NUM]; // 顶点向量
23
24 int
25 visited[MAX_VERTEX_NUM];
26 // 访问标志数组
27
28 int
29 arcs[MAX_VERTEX_NUM][MAX_VERTEX_NUM];
30 // 邻接矩阵
31
32 int
33 vexnum,arcnum;
34 // 图的当前顶点数和弧数
35
36 }mgraph,
37 *
38 MGraph;
39
40
41
42
43 void
44 init_mgraph(MGraph
45 & g)
46 // 初始化图
47
48 {
49
50 g = (MGraph)malloc( sizeof (mgraph));
51
52
53 g -> vexnum = 0 ;
54
55
56 g -> arcnum = 0 ;
57
58 for ( int
59 i = 0 ;i < MAX_VERTEX_NUM;i ++ )
60
61
62 g -> vexs[i] = 0 ;
63
64 for (i = 0 ;i < MAX_VERTEX_NUM;i ++ )
65
66
67 g -> visited[i] = 0 ;
68 // 访问标志数组置0,表示没有被访问
69
70 for (i = 0 ;i < MAX_VERTEX_NUM;i ++ )
71
72 for ( int
73 j = 0 ;j < MAX_VERTEX_NUM;j ++ )
74
75
76 g -> arcs[i][j] = 0 ;
77
78
79 }
80
81
82 void
83 add_vexs(MGraph
84 & g)
85 // 增加顶点
86
87 {
88
89 cout << " 请输入顶点的个数: " << endl;
90
91
92 cin >> g -> vexnum;
93
94
95 cout << " 请输入顶点的值 " << endl;
96
97 for ( int
98 i = 0 ;i < g -> vexnum;i ++ )
99
100
101 {
102
103 cin >> g -> vexs[i];
104
105
106 }
107
108 }
109 void
110 add_arcs(MGraph
111 & g)
112 // 增加边
113
114 {
115
116 cout << " 请输入边的个数: " << endl;
117
118
119 cin >> g -> arcnum;
120
121
122 VERTYPE ch1,ch2;
123 int
124 row,col;
125
126
127 for ( int
128 i = 0 ;i < g -> arcnum;i ++ )
129
130
131 {
132
133 cin >> ch1 >> ch2;
134
135 for ( int
136 j = 0 ;j < g -> vexnum;j ++ )
137
138
139 {
140 if (g -> vexs[j] == ch1)
141
142
143 {
144
145 row = j;
146
147
148 }
149 if (g -> vexs[j] == ch2)
150
151
152 {
153
154 col = j;
155
156
157 }
158
159 }
160
161 g -> arcs[row][col] = 1 ;
162
163
164 g -> arcs[col][row] = 1 ;
165 // 无向图加上此行
166
167 }
168
169 }
170
171
172 void
173 creat_mgraph(MGraph
174 & g)
175 // 创建图
176
177
178 {
179
180 add_vexs(g); // 增加顶点
181
182 add_arcs(g);
183 // 增加边
184
185 }
186
187
188 void
189 print_mgraph(MGraph
190 & g)
191 // 打印图
192
193 {
194
195 for ( int
196 i = 0 ;i < g -> vexnum;i ++ )
197
198
199 cout << "
200 " <<g->vexs[i];
201
202
203 cout << endl;
204
205 for (i = 0 ;i < g -> vexnum;i ++ )
206
207
208 {
209
210 cout << g -> vexs[i] << "
211 " ;
212
213 for ( int
214 j = 0 ;j < g -> vexnum;j ++ )
215
216
217 {
218
219 cout << g -> arcs[i][j] << "
220 " ;
221
222
223 }
224
225 cout << endl;
226
227
228 }
229
230 }
231
232
233 void
234 Visit(MGraph
235 & g, int
236 i)
237
238 {
239
240 cout << g -> vexs[i] << "
241 " ;
242
243
244 g -> visited[i] = 1 ;
245
246
247 }
248 // 深度优先搜索
249
250 void
251 DFSTraverse(MGraph
252 & g, int
253 i)
254 // 从第i个顶点开始搜索
255
256 {
257
258 Visit(g,i);
259 for ( int
260 j = 0 ;j < g -> vexnum;j ++ )
261
262 if (g -> arcs[i][j]
263 &&
264 ! g -> visited[j])
265
266
267 DFSTraverse(g,j);
268
269 }
270
271
272 int
273 main()
274
275 {
276
277 MGraph G;
278
279 init_mgraph(G); // 初始化图
280
281 creat_mgraph(G);
282 // 创建图
283
284 print_mgraph(G);
285 // 打印图
286
287 DFSTraverse(G, 0 );
288 // 深度优先搜索
289
290
291
292 return
293 0 ;
294
295
296 }

 

    原文作者:算法小白
    原文地址: https://www.cnblogs.com/rollenholt/articles/1907448.html
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞