图算法:广度优先搜索、路径与生成树
1. 广度优先搜索(Breadth-First Search)
深度优先搜索(DFS)的栈版本会将当前顶点的相邻顶点放入栈中,然后处理栈顶顶点,并将其相邻顶点再放入栈中。这种策略会导致初始顶点的相邻顶点位于栈底,从而在距离更远的顶点之后被处理。
而广度优先搜索(BFS)可以通过将栈替换为队列来实现。使用队列时,相邻顶点会先被处理,然后是这些相邻顶点的相邻顶点,依此类推。
以下是基于队列的广度优先搜索的 Ruby 代码:
def bfs(v)
raise ArgumentError, "No such vertex" if v < 0 or vertices <= v
queue = LinkedQueue.new
is_visited = []
queue.enter(Edge.new(-1,v))
while !queue.empty? do
edge = queue.leave
next if is_visited[edge.w]
yield edge.v,edge.w
is_visited[edge.w] = true
each_edge(edge.w) do |w,x|
queue.enter(Edge.new(w,x)) if !is_visited[x]
end
end
end
该算法每个顶点恰好访问一次,每条边最多访问两次,因此其性能为 $O(e + v)$,与基于栈的深度优先搜索相同,只是访问顶点的顺序不同。
超级会员免费看
订阅专栏 解锁全文

被折叠的 条评论
为什么被折叠?



