图的搜索有两种方式,一种是深度优先搜索
(Depth-First-Search),另一种是广度优先搜索
(Breadth-First-Search),接下来,我们来写一下这些搜索方式的代码实现。
广度优先搜索是按层来处理顶点,距离开始点最近的那些顶点首先被访问,而最远的那些顶点则最后被访问,这个和树的层序遍历很像,BFS的代码使用了一个队列。搜索步骤:
a .首先选择一个顶点作为起始顶点,并将其染成灰色,其余顶点为白色。
b. 将起始顶点放入队列中。
c. 从队列首部选出一个顶点,并找出所有与之邻接的顶点,将找到的邻接顶点放入队列尾部,将已访问过顶点涂成黑色,没访问过的顶点是白色。如果顶点的颜色是灰色,表示已经发现并且放入了队列,如果顶点的颜色是白色,表示还没有发现
d. 按照同样的方法处理队列中的下一个顶点。
基本就是出队的顶点变成黑色,在队列里的是灰色,还没入队的是白色。
用一副图来表达这个流程如下:

1.初始状态,从顶点1开始,队列={1}

2.访问1的邻接顶点,1出队变黑,2,3入队,队列={2,3,}

3.访问2的邻接顶点,2出队,4入队,队列={3,4}

4.访问3的邻接顶点,3出队,队列={4}

5.访问4的邻接顶点,4出队,队列={ 空}
分析:
从顶点1开始进行广度优先搜索:
初始状态,从顶点1开始,队列={1}
访问1的邻接顶点,1出队变黑,2,3入队,队列={2,3,}
访问2的邻接顶点,2出队,4入队,队列={3,4}
访问3的邻接顶点,3出队,队列={4}
访问4的邻接顶点,4出队,队列={ 空}
顶点5对于1来说不可达。
上面图可以用如下邻接矩阵来表示:
核心代码如下:
深度优先遍历图的方法是,从图中某顶点v出发:
a.访问顶点v;
b.依次从v的未被访问的邻接点出发,对图进行深度优先遍历;直至图中和v有路径相通的顶点都被访问;
c.若此时图中尚有顶点未被访问,则从一个未被访问的顶点出发,重新进行深度优先遍历,直到图中所有顶点均被访问过为止。
用一副图来表达这个流程如下:

1.从v = 顶点1开始出发,先访问顶点1

2.依次访问过顶点1,2,3后,终止于顶点3

3.从顶点3回溯到顶点2,继续访问顶点5,并且终止于顶点5

4.从顶点5回溯到顶点2,并且终止于顶点2

5.从顶点2回溯到顶点1,并终止于顶点1

6.从顶点4开始访问,并终止于顶点4
从顶点1开始做深度搜索:
初始状态,从顶点1开始
依次访问过顶点1,2,3后,终止于顶点3
从顶点3回溯到顶点2,继续访问顶点5,并且终止于顶点5
从顶点5回溯到顶点2,并且终止于顶点2
从顶点2回溯到顶点1,并终止于顶点1
从顶点4开始访问,并终止于顶点4
上图可以用邻接矩阵来表示为:
核心代码如下:(递归实现)
非递归实现如下,借助一个栈:
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/bian-cheng-ri-ji/33055.html