对于以下无向图,列出队列中的最大项目数。假设起始顶点是A。
在这一章中,你学习了广度优先搜索的迭代实现。现在写一个递归实现。
给图形添加一个方法,检测图形是否断开连接。下面是一个断开连接的图的例子。
为了帮助你解决这个难题,我们在Graph协议中添加了一个属性allVertices。
var allVertices: [Vertex<Element>] { get }
这个属性已经由AdjacencyMatrix和AdjacencyList实现。
队列中的最大项目数是3。
在广义优先搜索一章中,你学到了如何迭代地实现该算法。让我们来看看如何递归地实现它。
bfs接收源顶点以开始遍历。
queue记录了接下来要访问的相邻顶点。
enqueued记住了哪些顶点已经被添加到队列中。你可以使用一个Set来进行O(1)查找。一个数组是O(n)。
visited是一个数组,存储顶点被探索的顺序。
通过插入源顶点来启动该算法。
通过调用一个辅助函数在图上递归地执行bfs。
按顺序返回所访问的顶点。这个辅助函数看起来像这样。
基本情况下,递归地继续从队列中提取一个顶点,直到它为空。
将顶点标记为已访问。
对于来自当前顶点的每一条邻接边。
在插入队列之前,检查相邻顶点是否已被访问。
递归地执行bfs,直到队列为空。
广度优先搜索的总体时间复杂度为O(V+E)。
如果两个节点之间不存在路径,则称该图是断开的。
如果没有顶点,则将该图视为连接图。
从第一个顶点开始进行广度优先搜索。这个过程将返回所有被访问的节点。
遍历图中的每一个顶点,检查它是否曾经被访问过。如果在访问过的集合中缺少一个顶点,那么该图就是断开的。
上一章 | 目录 | 下一章 |
---|