В вашем псевдокоде отсутствует только один элемент: не гарантируется, что цикл G имеет цикл Гамильтона.
Так что вам нужно пройти первую проверку, прежде чем делать что-либо еще, что гарантирует, что он имеет цикл Гамильтона.
If not D(G):
Return No_Hamilton_Cycle!
Во-вторых, алгоритм возвращает a цикл Гамильтона (не ) : в G может быть много альтернативных циклов Гамильтона, но порядок, в котором вы пытаетесь удалить ребра, определяет, какой из этих конкурирующих циклов Гамильтона вы, наконец, получите.
С помощью указанного выше дополнения вы можете быть уверены, что в начале и в конце каждой итерации G 'имеет цикл Гамильтона: либо итерация удалит ребро и подтвердит, что G' все еще имеет цикл Гамильтона, либо что удаление отменено, так что состояние G 'такое же в конце, как и в начале этой итерации.
Когда l oop завершится, вы знаете, что:
- G 'имеет цикл Гамильтона, потому что это было верно в конце последняя итерация
- Нет ребра, которое вы можете удалить из G ', и у вас все еще есть цикл Гамильтона, потому что вы пытались удалить все эти ребра без успеха. Конечно, иногда у G 'все еще были другие ребра в этот момент попытки, но это не имеет значения: если ребро необходимо для наличия цикла Гамильтона в G', то оно все еще важно после того, как вы удалили некоторые другие существенные ребра.
- Этот алгоритм не добавил и не удалил ни одного узла: G 'имеет те же узлы, что и G
- Этот алгоритм не добавил никаких ребер: набор ребер G' является подмножество ребер G (возможно, равное ему).
Из этих пунктов можно сделать вывод, что если G имеет цикл Гамильтона, то G ' является циклом Гамильтона группы G.