Алгоритм построения Эйлерова цикла — различия между версиями
(→Псевдокод) |
(→Доказательство) |
||
Строка 18: | Строка 18: | ||
== Доказательство == | == Доказательство == | ||
− | + | Пусть <tex>P</tex> - напечатанный путь. Заметим, что первой в <tex>S</tex> помещается вершина <tex>v</tex>, и она будет последней перемещена из <tex>S</tex> в <tex>P</tex>. Следовательно, она будет последней вершиной в <tex>P</tex>. Далее, как было отмечено выше, первый раз, когда обнаружится, что все инцидентные активной вершине ребра пройдены, активной будет стартовая вершина <tex>v</tex>. Значит, эта вершина будет первой перемещена из <tex>S</tex> в <tex>P</tex>. Итак, по окончании работы алгоритма в начале и в конце последовательности вершин, содержащейся в <tex>P</tex>, находится вершина <tex>v</tex>. Иначе говоря, если эта последовательность представляет маршрут, то этот маршрут замкнут.<br> | |
− | + | Покажем, что маршрут замкнут.<br> | |
− | Пусть <tex>P</tex> - | + | Отметим, что в конечном итоге каждое ребро будет пройдено. Действительно, допустим, что в момент окончания работы алгоритма имеются еще не пройденные ребра. Поскольку граф связен, должно существовать хотя бы одно непройденное ребро, инцидентное посещенной вершине. Но тогда эта вершина не могла быть удалена из <tex>S</tex>, и <tex>S</tex> не мог стать пустым. |
+ | <tex> \Box </tex> | ||
== Рекурсивная реализация == | == Рекурсивная реализация == |
Версия 01:17, 24 февраля 2012
Содержание
Описание алгоритма
Приведенный ниже псевдокод алгоритма находит Эйлеров цикл как в ориентированном графе, так и в неориентированном графе. Перед запуском алгоритма необходимо проверить граф на эйлеровость. Чтобы построить Эйлеров путь, нужно запустить функцию из вершины с нечетной степенью.
Псевдокод
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
Время работы
Если реализовать удаление ребер за
, то алгоритм будет работать за .