广度优先搜索与深度优先搜索
广度优先搜索
此处举一个特例,用
#include "0_.h"
void BFS(MGraph G)
{
int v, w, i;
Queue Q;
for (i = 0; i < MaxVertexNum; i++) {
Visited[i] = 0;
}
Q = CreatQueue();
for (i = 0; i < G->nv; i++) {
if (Visited[i] == 0) {
printf("{ ");
Visited[i] = 1;
printf("%d ", i);
EnQueue(Q, i);
while (!IsEmptyQ(Q)) {
v = DeQueue(Q);
/*********************************/
for (w = 0; w < G->nv; w++) {
if (!Visited[w] && G->Edge[v][w]) {
Visited[w] = 1;
printf("%d ", w);
EnQueue(Q, w);
}
}
/*********************************/
}
printf("}");
if (!FinishVisit(G))
printf("\n");
}
}
return;
}
注释包裹处可替换为下列代码的思路,更具有一般性
w = 0;
/* v为给定的第一个点,先找到v的邻接点,将其入队 */
for (w = FirstAdjV(G, v, w); w < G->nv; w = NextAdjV(G, v, w)) {
if (!Visited[w]) {
Visited[w] = 1;
printf("%d ", w);
EnQueue(Q, w);
} else
break;
}
Vertex FirstAdjV(MGraph G, Vertex v, Vertex w)
{
int i;
for (i = w; i < G->nv; i++) {
if (!Visited[i] && G->Edge[v][i])
break;
}
return i;
}
Vertex NextAdjV(MGraph G, Vertex v, Vertex w)
{
return FirstAdjV(G, v, w);
}
深度优先搜索
for (i = 0; i < G->nv; i++) {
if (!Visited[i]) {
printf("{ ");
DFS(G, i);
printf("}\n");
}
}
void DFS(MGraph G, Vertex v)
{
int w;
printf("%d ", v);
Visited[v] = 1;
for (w = 0; w < G->nv; w++) {
if (!Visited[w] && G->Edge[v][w]) {
DFS(G, w);
}
}
}