Skip to content

Graph Templates

Graph Construction Template

The overwhelming majority of Graph problems give you a list of edges. You must build an Adjacency List before traversing.

from collections import defaultdict

def build_graph(num_nodes, edges):
    graph = defaultdict(list)

    for u, v in edges:
        graph[u].append(v)
        graph[v].append(u) # OMIT this line if the graph is DIRECTED

    return graph

Graph Traversal Template (DFS with Cycle Detection)

def has_path(graph, start, target):
    visited = set()

    def dfs(node):
        if node == target:
            return True

        if node in visited:
            return False

        visited.add(node)

        for neighbor in graph[node]:
            if dfs(neighbor):
                return True

        return False

    return dfs(start)

Topological Sort Template (Kahn's Algorithm)

from collections import defaultdict, deque

def topological_sort(num_nodes, edges):
    graph = defaultdict(list)
    in_degree = {i: 0 for i in range(num_nodes)}

    # Build Directed Graph and In-Degrees
    for prereq, course in edges:
        graph[prereq].append(course)
        in_degree[course] += 1

    # Start with nodes having 0 prerequisites
    queue = deque([k for k, v in in_degree.items() if v == 0])
    order = []

    while queue:
        node = queue.popleft()
        order.append(node)

        for neighbor in graph[node]:
            in_degree[neighbor] -= 1
            if in_degree[neighbor] == 0:
                queue.append(neighbor)

    # Return order if all nodes processed (no cycle), else empty
    return order if len(order) == num_nodes else []