Chapter 39: Breadth-First Search Challenges


Last updated


Last updated
extension Graph where Element: Hashable {
func bfs(from source: Vertex<Element>) -> [Vertex<Element>] {
var queue = QueueStack<Vertex<Element>>()
var enqueued: Set<Vertex<Element>> = []
var visited: [Vertex<Element>] = []
// Recursive implementation
queue.enqueue(source)
enqueued.insert(source)
bfs(queue: &queue, enqueued: &enqueued, visited: &visited)
return visited
}
private func bfs(queue: inout QueueStack<Vertex<Element>>, enqueued: inout Set<Vertex<Element>>, visited: inout [Vertex<Element>]) {
// 遞迴終止條件
guard let vertex = queue.dequeue() else { return }
// 此點已經拜訪過
visited.append(vertex)
// 找出此點的鄰居們
let neighborEdges = edges(from: vertex)
neighborEdges.forEach { edge in
// 確保此鄰居在之前沒被拜訪過
if !enqueued.contains(edge.destination) {
queue.enqueue(edge.destination)
enqueued.insert(edge.destination)
}
}
// 遞迴
bfs(queue: &queue, enqueued: &enqueued, visited: &visited)
}
}extension Graph where Element: Hashable {
func isDisconnected() -> Bool {
// Add your code here
guard let firstVertex = allVertices.first else {
// 若圖沒有任何一個點也定義為相連
return false
}
// 利用BFS找出所有相連的點
let visited = breadthFirstSearch(from: firstVertex)
for vertex in allVertices {
// 若此點不存在visited裡面,表示找不到一個path可以連接這個點
if !visited.contains(vertex) {
return true
}
}
return false
}