Алгоритм построения Эйлерова цикла
Содержание
Описание алгоритма
Приведенный ниже псевдокод алгоритма находит Эйлеров цикл как в ориентированном графе, так и в неориентированном графе. Перед запуском алгоритма необходимо проверить граф на эйлеровость. Чтобы построить Эйлеров путь, нужно запустить функцию из вершины с нечетной степенью.
Псевдокод
findPath(v): S.clear() S.add(v) while not stack.isEmpty(): w := S.top() if E contains (w, u): S.add(u) remove(w, u) else: S.pop() print w
Доказательство
Пусть
Покажем, что маршрут замкнут.
Отметим, что в конечном итоге каждое ребро будет пройдено. Действительно, допустим, что в момент окончания работы алгоритма имеются еще не пройденные ребра. Поскольку граф связен, должно существовать хотя бы одно непройденное ребро, инцидентное посещенной вершине. Но тогда эта вершина не могла быть удалена из , и не мог стать пустым.
Рекурсивная реализация
findPath(v): for (v, u) from E remove (v, u) findPath(u) print v
Время работы
Если реализовать удаление ребер за
, то алгоритм будет работать за .