DSA Crash Course
Templates

Template: 6. BFS — Level-Order / Shortest Path

Mark when done:

6. BFS — Level-Order / Shortest Path

# =============================================================================
from collections import deque

def bfs(start, get_neighbors, is_goal=None):
    queue = deque([start])
    visited = {start}
    level = 0
    while queue:
        for _ in range(len(queue)):  # process one level
            node = queue.popleft()
            if is_goal and is_goal(node):
                return level
            for neighbor in get_neighbors(node):
                if neighbor not in visited:
                    visited.add(neighbor)
                    queue.append(neighbor)
        level += 1
    return -1


# =============================================================================