代码改变世界

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

2010-12-16 00:34  Rollen Holt  阅读(422)  评论(0编辑  收藏  举报

代码
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 }