17
правок
Изменения
Отредактировано доказательство
'''for''' v '''in''' <tex>V</tex>
'''if''' vertexDegree(v) > 0 '''and''' '''not''' vis[v] <font color=darkgreen>// если количество компонент связности, содержащие ребра, больше одной,</font>
'''return''' ''false'' <font color=darkgreen> // то граф не является эйлеровым</font>
'''return''' ''true'' // граф является эйлеровым
'''return''' count
'''Код построения эйлерова циклапути:''' '''function''' findEulerPath(v : Vertex): <font color=darkgreen> // если граф является полуэйлеровым, то алгоритм следует запускать из вершины нечетной степени </font> Stack stack<tex>S</tex> stack<tex>S</tex>.push(v) '''while not''' stack<tex>S</tex>.isEmpty() w = stack<tex>S</tex>.top()
'''if''' exists (w, u) '''in''' <tex>E</tex>
remove(w, u)
'''else'''
print(w)
</font>
== Доказательство ==
#На следующем шаге <tex>u</tex> перемещена в <tex>S</tex>. Тогда <tex>(w,u)</tex> представлено в <tex>P</tex>.
#Сначала будет пройдена некоторая последовательность ребер, начинающаяся в вершине <tex>u</tex>. Ввиду четности степеней эта последовательность может закончиться только в вершине <tex>u</tex>, а значит она следующей попадет в <tex>P</tex> и <tex>(w,u)</tex> будет представлено в <tex>P</tex>.
<tex> \Box </tex>
== Время работы ==
Если реализовать поиск ребер инцидентных вершине и удаление ребер за <tex>O(1)</tex>, то алгоритм будет работать за <tex>O(E)</tex>.<br>
Чтобы реализовать поиск за <tex>O(1)</tex>, для хранения графа следует использовать списки смежных вершин; для удаления достаточно добавить всем ребрам свойство deleted бинарного типа. Тогда удаление ребер будет выглядеть следующим образом:<font size=2> '''function''' remove(v : Vertex, index : '''int'''): graph[v][index] = graph[v].back() graph[v].pop()</font>
== См. также ==