图的基本遍历算法 DFS and BFS

先介绍下DFS

下面这张图呢是图的原来状态

alt

这个gif呢是其深度优先遍历的过程,ppt做的,可能会失真

alt

遍历的思想有了,但是对于非稀疏图来讲利用图的邻接矩阵遍历效果是不是更好。
那么代码就来了;

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
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
#include<iostream>
#include<queue>
#include<stack>
/*
图的深度优先搜索
数据结构中介绍需要用到栈的帮助
这里的栈用C++ STL的stack
*/
using namespace std;
#define number 5
//定义图的邻接矩阵
void DFS(int start);
int map[][5]=
{
0,1,1,0,0,
0,0,1,0,1,
0,0,1,0,0,
1,1,0,0,1,
0,0,1,0,0
};
//访问过的顶点
int visited[number + 1];

int main()
{
//初始化数组为0,表示一个也没访问
memset(visited, 0, sizeof(visited));
for (int i = 1; i <= number; i++)
{
if (visited[i] == 1)
continue;
DFS(i);
}
system("pause");
return 0;
}
void DFS(int start)
{
stack<int> stk;
//顶点入栈
stk.push(start);
//表示访问
visited[start] = 1;

bool IS_PUSH = false;//是否有新的顶点入栈
while (!stk.empty())
{
IS_PUSH = false;
int p = stk.top();
for (int i = 1; i <= number; i++)
{
if (map[p - 1][i - 1] == 1 && !visited[i])
//如果他俩联通,并且还没有访问过
{
visited[i] = 1;
stk.push(i);
IS_PUSH = true;//新顶点入栈
break;
}
}
if (!IS_PUSH)
{
cout << p << " ";
stk.pop();//顶点出栈
}
}
}

运行结果,看图就能看出来了,不过代码只是更简单点了

BFS

alt

alt

代码用到队列

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
void BFS(int start)
{
queue<int> que;
//顶点入队
que.push(start);
//表示访问
visited[start] = 1;

while (!que.empty())
{
int p = que.front();
cout << p << " ";
que.pop();
for (int i = 1; i <= number; i++)
{
if (map[p - 1][i - 1] == 1 && !visited[i])
//如果他俩联通,并且还没有访问过
{
visited[i] = 1;
que.push(i);
}
}
}
}