# needs refactoring class BFS def initialize(graph, s) @graph = graph @s = s @visited = [@s] @edge_to = {} end def bfs(target) return true if target == @s queue = [@s] while queue.length > 0 node = queue.shift @graph[node].each do |child_node| return true if child_node == target next if @visited.include? child_node queue.push(child_node) @visited.push(child_node) @edge_to[child_node] = node end end false end def path_to?(node) path = [] until node == @s path.unshift(node) node = @edge_to[node] end path end end