Вот моё доказательство.
Если кто найдет ошибку или какие-то неясности, то пожалуйста прокомментируйте. Тем более, что доказательство получилось немаленькое, так что там может быть всяко-разно.
Доказательство проведем в три этапа.
Этап 1. Простые цепи в различных компонентах связности.
Возьмем граф с исходными условиями (граф G) и выберем две произвольные несмежные вершины X и Y. Если их удалить граф распадется на две компоненты
и
. Каждая из вершин X и Y имеет в первоначальном графе ребра как к
так и к
. Если бы одна из вершин не имела связи с одной из компонент, то достаточно было бы удалить только вторую вершину и получить несвязные между собой компоненты (а это нарушает условие). А так как обе компоненты связные, то это значит, что существует путь в исходном графе из X в Y, состоящий из ребра от X к какой-то вершине компоненты
, дальше по вершинам только этой компоненты и в конце от
до Y (в силу связности
). Тоже самое для X,
и Y.
На самом деле таких путей по каждой компоненте может быть несколько, но один в силу вышесказанного для каждой компоненты существует. Заметим, что хотя найденные пути могут оказаться не простыми, но их всегда можно сделать простыми, отбрасывая ненужные циклы.
Кстати, если бы по каким-либо причинам G раскололся на три и более компонент. То такой путь существовал бы для каждой (в силу двусвязности).
Этап 2. Существование Гамильтонова цикла.
Утверждается, что в графе G обязательно существует Гамильтонов цикл (простой цикл, проходящий через все вершины). Докажем это. Доказательство проведем конструктивно, то есть построим алгоритм находящий Гамильтонову цепь (простая цепь через все вершины), а потом преобразуем её в цикл.
Обозначим за
цепь, которая образуется на некотором цикле алгоритма и состоящая из k вершин (в порядке, как они представлены в записи).
– это множество вершин, которые еще не принадлежат цепи на том же цикле. На каждом цикле последняя вершина
будет считаться текущей вершиной для присоединения новых вершин или простых цепей.
Алгоритм
1. Выбираем произвольную вершину и помещаем её в
и соответственно получаем множество
(уже без этой вершины).
– текущая вершина.
2. Выбираем из
произвольную вершину
. Рассматриваем две вершины
и
.
Если они смежные, то добавляем вершину
в цепь и делаем её текущей (соответственно меняем
и удаляем из
вершину
). Если же вершины несмежные, то удалив их из исходного графа получим несколько компонент связности, причем в одной из компонент связности будут находится все вершины цепи
, за исключением вершины
, которая удаляется из графа. Исходя из этапа 1 существует простая цепь, находящаяся полностью в другой компоненте связности и соединяющая
и
. Раз эта цепь находится в другой компоненте связности, то она не имеет пересечений с цепью
, и может продлить цепь
до вершины
(Здесь надо добавить цепь в конец
и удалить вершины цепи из
, увеличить
на длину пристыкованной цепи). То есть после шага 2 длина простой цепи увеличиться.
3. Если в множестве
, остались вершины, то переходим к шагу 2, иначе получена простая (Гамильтонова) цепь из всех вершин графа
.
Алгоритм всегда завершается построением Гамильтоновой цепи, так как на каждом цикле цепь увеличивается. Ну и поскольку любая оставшаяся вершина графа может быть или смежной с
или несмежной, то все они рано или поздно за конечное количество циклов (не более количества вершин n в исходном графе) будут подключены к цепи.
Примечание. Ради интереса можно посмотреть, что произойдет, когда в графе останется только одна неподключенная к цепи вершина. На самом деле, эта вершина может быть только смежной к вершине поскольку вся остальная цепь оказывается в одной компоненте связности (второй компоненты нет, и граф остается связным) после удаления и этой последней вершины из графа. То есть, эта вершина подключается как смежная к .
Последний вопрос на этом этапе это превращения Гамильтоновой цепи в Гамильтонов цикл. Из тех же соображений, что указаны в примечании, оказывается, что вершины
и
смежные и могут быть соединены ребром. Таким образом, Гамильтонов цикл построен.
Этап 3. Единственность цикла.
То, что существует Гамильтонов цикл ещё не значит, что это единственный цикл в исходном графе
. Предположим, что Гамильтонов цикл построен. По определению он простой и проходит через все вершины. Если в графе
нет других ребер, кроме принадлежащих Гамильтонову циклу, то единственность автоматически доказана. Предположим, что есть еще какие то ребра не входящие в Гамильтонов цикл. Любое из таких ребер соединяет две вершины Гамильтонова цикла (причем эти вершины не являются смежными в Гамильтоновом цикле, иначе это бы означало, что две вершины может соединять несколько ребер). Возьмем такое ребро
, этим ребром цикл разделится на две части
и
. В каждой из частей обязательно есть вершина(
в
и
в
), не принадлежащая добавленному ребру
. Если удалить эти две вершины (
и
) из графа, то граф останется связным в силу существования дополнительного ребра
между вершинами Гамильтонова цикла. Это не соответствует исходным условиям, наложенным на граф
и это означает, что в графе
не существует никаких других рёбер, кроме принадлежащих Гамильтонову циклу.
Что и доказывает единственность данного цикла (Гамильтонова) в графе.