图的深度优先遍历(DFS) 与 广度优先遍历(BFS)

DFS —— 在一条路上一路到底的遍历

BFS —— 层层递进的遍历

数据结构课代码实现 之 深度优先遍历(DFS) 与 广度优先遍历(BFS)

简要理解

附之前的三篇文章:

DFS(深度优先遍历) 与 BFS(广度优先遍历)

DFS经典问题

BFS经典问题

代码实现

这里提供的代码默认都是从 0 号地址的结点开始的,请自行修改

请区分点的 地址 与 储存的数据!

邻接表存图

BFS

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
bool visited[MAX_VERTEX_NUM];

void visit(ALGraph g, int i)
{
cout << "BFS顺序遍历下当前点的储存值为:";
cout << g.vertices[i].data << endl;
}

void BFSTraverse(ALGraph G)
{
for(int i = 0;i < G.vexnum;i++)
visited[i] = false;
queue<ArcNode *> q;
for(int i = 0;i < G.vexnum;i++)
{
if(!visited[i])
{
visited[i] = true;
visit(G, i);
if(G.vertices[i].firstarc != NULL)
q.push(G.vertices[i].firstarc);
while(!q.empty())
{
ArcNode* t = q.front();
q.pop();
for(int j = t->adjvex;t->nextarc != NULL;t = t->nextarc, j = t->adjvex)
{
if(!visited[j])
{
visited[j] = true;
visit(G, j);
q.push(G.vertices[j].firstarc);
}
}
}
}
}
}

int main()
{
ALGraph g;
CreateGraph(g);
BFSTraverse(g);
return 0;
}

DFS

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
bool visited[MAX_VERTEX_NUM];

void visit(ALGraph g, int i)
{
cout << "DFS顺序遍历下当前点的储存值为: ";
cout << g.vertices[i].data << endl;
}

void DFS(ALGraph g, int i)
{
visited[i] = true;
visit(g, i);
int j;
ArcNode* k;
for(j = g.vertices[i].firstarc->adjvex, k = g.vertices[i].firstarc;k->nextarc != NULL;k = k->nextarc, j = k->adjvex)
if(!visited[j])
DFS(g, j);
}

void DFSTraverse(ALGraph g)
{
for(int i = 0;i < g.vexnum;i++)
visited[i] = false;
for(int i = 0;i < g.vexnum;i++)
if(!visited[i])
DFS(g, i);
}

int main()
{
ALGraph g;
CreateGraph(g);
DFSTraverse(g);
return 0;
}

邻接矩阵存图

BFS

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
bool visited[MAX_VERTEX_NUM];

void visit(MGraph g, int i)
{
cout << "BFS顺序遍历下当前点的储存值为: ";
cout << g.vexs[i] << endl;
}

void BFSTraverse(MGraph G)
{
for(int i = 0;i < G.vexnum;i++)
visited[i] = false;
queue<int> q;
for(int i = 0;i < G.vexnum;i++)
{
if(!visited[i])
{
visited[i] = true;
visit(G, i);
q.push(i);
while(!q.empty())
{
int t = q.front();
q.pop();
for(int j = 0;j < G.vexnum;j++)
{
if(G.arcs[t][j].adj != INFINITY && !visited[j])
{
visited[j] = true;
visit(G, j);
q.push(j);
}
}
}
}
}
}

int main()
{
MGraph a;
CreateGraph(a);
BFSTraverse(a);
return 0;
}

DFS

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
bool visited[MAX_VERTEX_NUM];

void visit(MGraph g, int i)
{
cout << "DFS顺序遍历下当前点的储存值为: ";
cout << g.vexs[i] << endl;
}

void DFS(MGraph G, int i)
{
visited[i] = true;
visit(G, i);
int j = 0;
for(int k = 0;k < G.vexnum;k++)
if(!visited[k] && G.arcs[i][k].adj != INFINITY)
DFS(G, k);
}

void DFSTraverse(MGraph &G)
{
for(int i = 0;i < G.vexnum;i++)
visited[i] = false;
for(int i = 0;i < G.vexnum;i++)
if(!visited[i])
DFS(G, i);
}

int main()
{
MGraph a;
CreateGraph(a);
DFSTraverse(a);
return 0;
}