Algolume

DFS: Обход графа

Задача: Дан неориентированный связный граф, не содержащий кратных ребер и петель, представленный списком смежности. Необходимо выполнить обход в глубину (DFS), начиная с заданной вершины.

Формат входных данных: В первой строке заданы два числа: n и m (1 ≤ n, m ≤ 100000) – количество вершин и количество рёбер соответственно. В следующих m строках заданы пары целых чисел v и u (1 ≤ u, v ≤ n), обозначающие ребро между вершинами v и u (граф неориентированный). Последняя строка содержит одно число s – номер стартовой вершины.

Формат выходных данных: В первой строке выведите порядок обхода вершин через пробел. Далее в n строках для каждой посещённой вершины выведите путь от стартовой вершины до неё.

Решение: Для решения задачи используется алгоритм DFS. Создаётся список used для отметки посещённых вершин, а также массив parent для восстановления пути от текущей вершины до стартовой.

Начальное условие:

used = [False] * n

parent = [-1] * n

Рекурсивная функция dfs посещает вершину, отмечает её как посещённую, добавляет её в список обхода, а затем для каждого непосещённого соседа обновляет массив parent и рекурсивно вызывает себя.

После завершения обхода, для восстановления пути от стартовой вершины до любой другой вершины, можно пройтись по массиву parent:

Визуализируйте алгоритм! (Python3)

Для стабильной работы визуализации, ограничения на входные данные следующие: 1 ≤ n ≤ 15.

Логическое название Название переменной
graph
parent