
def reachable_layers(
    edges: list[tuple[int, int]], n: int, start: int, rounds: int
) -> list[list[int]]:
    seen = [0] * n
    seen[start] = 1
    trace = [seen.copy()]
    for _ in range(rounds):
        next_seen = seen.copy()
        for source, target in edges:
            if seen[source]:
                next_seen[target] = 1
        seen = next_seen
        trace.append(seen.copy())
    return trace


edges = [(0, 1), (0, 2), (1, 3), (2, 4), (4, 5)]
trace = reachable_layers(edges, n=6, start=0, rounds=3)
assert trace[1] == [1, 1, 1, 0, 0, 0]
assert trace[2] == [1, 1, 1, 1, 1, 0]
assert trace[3] == [1, 1, 1, 1, 1, 1]
for state in trace:
    print(state)
