Напомним, что эйлеровым циклом называется
Этот алгоритм похож на алгоритм
Алгоритм 1.
Для обоснования алгоритма заметим сначала, что первой в стек $$S$$ помещается вершина $$a$$, и она будет последней перемещена из $$S$$ в $$C$$. Следовательно, она будет последней вершиной в стеке $$C$$. Далее, как было отмечено выше, первый раз, когда обнаружится, что все инцидентные активной вершине ребра пройдены (т.е. будет выполняться ветвь else в строке 8), активной будет стартовая вершина $$a$$. Значит, эта вершина будет первой перемещена из $$S$$ в $$C$$. Итак, по окончании работы алгоритма в начале и в конце последовательности вершин, содержащейся в стеке $$C$$, находится вершина $$a$$. Иначе говоря, если эта последовательность представляет маршрут (а далее будет показано, что так оно и есть), то этот маршрут замкнут.
Далее отметим, что в конечном итоге каждое ребро будет пройдено. Действительно, допустим, что в момент окончания работы алгоритма имеются еще не пройденные ребра. Поскольку граф связен, должно существовать хотя бы одно непройденное ребро, инцидентное посещенной вершине. Но тогда эта вершина не могла быть удалена из стека $$S$$, и $$S$$ не мог стать пустым.
Будем говорить, что ребро $$(x,y)$$ представлено в стеке ( $$S$$ или $$C$$ ), если в какой-то момент работы алгоритма в стеке рядом находятся вершины $$x$$ и $$y$$. Ясно, что каждое ребро графа будет представлено в стеке $$S$$ и что каждые две вершины, расположенные рядом в этом стеке, образуют ребро. Допустим, в какой-то момент из стека $$S$$ в стек $$C$$ перемещается вершина $$x$$, а непосредственно под ней в стеке $$S$$ находится вершина $$y$$. Возможно, что вершина $$y$$ будет перемещена из $$S$$ в $$C$$ при следующем повторении цикла while, тогда ребро $$(x,y)$$ будет представлено в стеке $$C$$. Другая возможность - между перемещением вершины $$x$$ и следующим перемещением, т.е. следующим выполнением ветви else, будет несколько раз выполнена ветвь then (строки 6,\,7). Это означает, что будет пройдена некоторая последовательность ребер, начинающаяся в вершине $$y$$. Ввиду четности степеней эта последовательность может закончиться только в вершине $$y$$. Значит, и в этом случае следующей за вершиной $$x$$ будет перемещена из $$S$$ в $$C$$ вершина $$y$$. В любом случае ребро $$(x,y)$$ будет представлено в стеке $$C$$. Из этого рассуждения видно, что последовательность вершин в стеке $$C$$ является маршрутом и что каждое ребро графа в конечном итоге будет содержаться в этом маршруте, причем один раз.
При каждом повторении цикла while в рассмотренном алгоритме либо проходится одно ребро, либо одна вершина перемещается из $$S$$ в $$C$$. Последнее можно трактовать как прохождение уже пройденного однажды ребра в обратном направлении. Каждое ребро в каждом направлении будет пройдено один раз, поэтому общая трудоемкость этого алгоритма оценивается как $$O(m)$$. Необходимо только оговориться, что этот вывод, как и аналогичные заключения об алгоритмах обхода в первых разделах этой главы, справедлив лишь при определенных предположениях о том, как задан граф. Способ задания должен обеспечить возможность быстрого просмотра множества ребер, инцидентных данной вершине. Подходящим является, например, задание графа списками инцидентности, в которых для каждой вершины перечисляются инцидентные ей ребра. Необходимо также иметь возможность быстро пометить ребро как пройденное или проверить, пройдено ли данное ребро. Для этого подходящей структурой может служить характеристический массив на множестве ребер.
(рис 8.1) Внешне определение гамильтонова цикла похоже на определение эйлерова
цикла. Однако есть кардинальное различие в сложности решения
соответствующих задач распознавания и построения. Мы видели, что имеется
достаточно простой
Более рациональный подход состоит в рассмотрении всевозможных простых
путей, начинающихся в произвольно выбранной стартовой вершине $$a$$,
до тех пор, пока не будет обнаружен
Рассмотрим этот алгоритм подробнее. Будем считать, что граф задан
окрестностями вершин: для каждой вершины $$x$$ задано множество
вершин, смежных с $$x$$. На каждом шаге алгоритма имеется уже
построенный отрезок пути, он хранится в стеке PATH. Для каждой
вершины $$x$$, входящей в PATH, хранится множество $$N(x)$$
всех вершин, смежных с $$x$$, которые еще не рассматривались в
качестве возможных продолжений пути из вершины $$x$$. Когда вершина $$x$$ добавляется к пути, множество $$N(x)$$ полагается
равным $$V(x)$$. В дальнейшем рассмотренные вершины удаляются из этого
множества. Очередной шаг состоит в исследовании окрестности последней
вершины $$x$$ пути PATH.
Если $$N(x)\ne \varnothing$$
и в $$N(x)$$ имеются вершины, не принадлежащие пути, то одна из
таких
вершин добавляется к пути. В противном случае вершина $$x$$
исключается из стека. Когда после добавления к пути очередной вершины
оказывается, что путь содержит все вершины графа, остается проверить,
смежны ли первая и последняя вершины пути, и при утвердительном ответе
выдать очередной
Алгоритм 2.
Этот алгоритм очень похож на алгоритм
(рис 8.2) В худшем случае время работы этого алгоритма тоже растет с факториальной
скоростью. Например, для графа $$K_{n-1} +K_{1}$$ (граф с двумя
Рассмотрим другой алгоритм, выясняющий существование гамильтонова цикла,
по сути близкий к
Пусть граф $$G$$ задан матрицей смежности $$A=\left\| A(i,j)\right\|$$. Выберем произвольно стартовую вершину $$a$$ и определим для каждого $$k=0,1\ldots, n-2$$ функцию $$H_{k} (x,X)$$, где значениями переменной $$x$$ являются вершины, отличные от $$a$$, а значениями переменной $$X$$ - $$k$$ -элементные подмножества множества $$VG-\{ a\}$$, причем вершина $$x$$ не должна принадлежать множеству $$X$$. Эти функции определяются так: полагаем $$H_{k} (x,X)=1$$, если существует простой путь длины $$k+1$$ из вершины $$a$$ в вершину $$x$$, проходящий только через вершины из множества $$X$$, и $$H_{k} (x,X)=0$$, если такого пути не существует. Тогда
$$H_{0} (x,\varnothing)=A(a,x) \qquad \text{для всех } x,$$а для $$k>0$$
$$H_{k} (x,X)=\mathop{\vee}\limits_{y\in X} H_{k-1} (y,X-y)A(y,x). }$$Таким образом, зная все значения функции $$H_{k-1}$$, мы можем вычислить все значения функции $$H_{k}$$, причем для вычисления одного значения требуется выполнить $$2k-1$$ логических операций. Общее количество логических операций для вычисления всех этих функций составит
$$(n-1)\suml_{k=1}^{n-2}\begin{pmatrix} {n-2} \\ k \end{pmatrix} (2k-1)=(n-1)(2^{n-2} (n-3)+1)=O(n^{2} 2^{n}).$$После того, как будет вычислена функция $$H_{n-2}$$, останется
только для
всех $$x$$, для которых $$H_{n-2} (x,X)=1$$
( $$X$$ в этом случае
определяется однозначно), выяснить, чему равно $$A(x,a)$$ -
если хотя бы
в одном случае это 1, то
Напомним, что эйлеровым циклом называется
Этот алгоритм похож на алгоритм
Алгоритм 1.
Для обоснования алгоритма заметим сначала, что первой в стек $$S$$ помещается вершина $$a$$, и она будет последней перемещена из $$S$$ в $$C$$. Следовательно, она будет последней вершиной в стеке $$C$$. Далее, как было отмечено выше, первый раз, когда обнаружится, что все инцидентные активной вершине ребра пройдены (т.е. будет выполняться ветвь else в строке 8), активной будет стартовая вершина $$a$$. Значит, эта вершина будет первой перемещена из $$S$$ в $$C$$. Итак, по окончании работы алгоритма в начале и в конце последовательности вершин, содержащейся в стеке $$C$$, находится вершина $$a$$. Иначе говоря, если эта последовательность представляет маршрут (а далее будет показано, что так оно и есть), то этот маршрут замкнут.
Далее отметим, что в конечном итоге каждое ребро будет пройдено. Действительно, допустим, что в момент окончания работы алгоритма имеются еще не пройденные ребра. Поскольку граф связен, должно существовать хотя бы одно непройденное ребро, инцидентное посещенной вершине. Но тогда эта вершина не могла быть удалена из стека $$S$$, и $$S$$ не мог стать пустым.
Будем говорить, что ребро $$(x,y)$$ представлено в стеке ( $$S$$ или $$C$$ ), если в какой-то момент работы алгоритма в стеке рядом находятся вершины $$x$$ и $$y$$. Ясно, что каждое ребро графа будет представлено в стеке $$S$$ и что каждые две вершины, расположенные рядом в этом стеке, образуют ребро. Допустим, в какой-то момент из стека $$S$$ в стек $$C$$ перемещается вершина $$x$$, а непосредственно под ней в стеке $$S$$ находится вершина $$y$$. Возможно, что вершина $$y$$ будет перемещена из $$S$$ в $$C$$ при следующем повторении цикла while, тогда ребро $$(x,y)$$ будет представлено в стеке $$C$$. Другая возможность - между перемещением вершины $$x$$ и следующим перемещением, т.е. следующим выполнением ветви else, будет несколько раз выполнена ветвь then (строки 6,\,7). Это означает, что будет пройдена некоторая последовательность ребер, начинающаяся в вершине $$y$$. Ввиду четности степеней эта последовательность может закончиться только в вершине $$y$$. Значит, и в этом случае следующей за вершиной $$x$$ будет перемещена из $$S$$ в $$C$$ вершина $$y$$. В любом случае ребро $$(x,y)$$ будет представлено в стеке $$C$$. Из этого рассуждения видно, что последовательность вершин в стеке $$C$$ является маршрутом и что каждое ребро графа в конечном итоге будет содержаться в этом маршруте, причем один раз.
При каждом повторении цикла while в рассмотренном алгоритме либо проходится одно ребро, либо одна вершина перемещается из $$S$$ в $$C$$. Последнее можно трактовать как прохождение уже пройденного однажды ребра в обратном направлении. Каждое ребро в каждом направлении будет пройдено один раз, поэтому общая трудоемкость этого алгоритма оценивается как $$O(m)$$. Необходимо только оговориться, что этот вывод, как и аналогичные заключения об алгоритмах обхода в первых разделах этой главы, справедлив лишь при определенных предположениях о том, как задан граф. Способ задания должен обеспечить возможность быстрого просмотра множества ребер, инцидентных данной вершине. Подходящим является, например, задание графа списками инцидентности, в которых для каждой вершины перечисляются инцидентные ей ребра. Необходимо также иметь возможность быстро пометить ребро как пройденное или проверить, пройдено ли данное ребро. Для этого подходящей структурой может служить характеристический массив на множестве ребер.
(рис 8.1) Внешне определение гамильтонова цикла похоже на определение эйлерова
цикла. Однако есть кардинальное различие в сложности решения
соответствующих задач распознавания и построения. Мы видели, что имеется
достаточно простой
Более рациональный подход состоит в рассмотрении всевозможных простых
путей, начинающихся в произвольно выбранной стартовой вершине $$a$$,
до тех пор, пока не будет обнаружен
Рассмотрим этот алгоритм подробнее. Будем считать, что граф задан
окрестностями вершин: для каждой вершины $$x$$ задано множество
вершин, смежных с $$x$$. На каждом шаге алгоритма имеется уже
построенный отрезок пути, он хранится в стеке PATH. Для каждой
вершины $$x$$, входящей в PATH, хранится множество $$N(x)$$
всех вершин, смежных с $$x$$, которые еще не рассматривались в
качестве возможных продолжений пути из вершины $$x$$. Когда вершина $$x$$ добавляется к пути, множество $$N(x)$$ полагается
равным $$V(x)$$. В дальнейшем рассмотренные вершины удаляются из этого
множества. Очередной шаг состоит в исследовании окрестности последней
вершины $$x$$ пути PATH.
Если $$N(x)\ne \varnothing$$
и в $$N(x)$$ имеются вершины, не принадлежащие пути, то одна из
таких
вершин добавляется к пути. В противном случае вершина $$x$$
исключается из стека. Когда после добавления к пути очередной вершины
оказывается, что путь содержит все вершины графа, остается проверить,
смежны ли первая и последняя вершины пути, и при утвердительном ответе
выдать очередной
Алгоритм 2.
Этот алгоритм очень похож на алгоритм
(рис 8.2) В худшем случае время работы этого алгоритма тоже растет с факториальной
скоростью. Например, для графа $$K_{n-1} +K_{1}$$ (граф с двумя
Рассмотрим другой алгоритм, выясняющий существование гамильтонова цикла,
по сути близкий к
Пусть граф $$G$$ задан матрицей смежности $$A=\left\| A(i,j)\right\|$$. Выберем произвольно стартовую вершину $$a$$ и определим для каждого $$k=0,1\ldots, n-2$$ функцию $$H_{k} (x,X)$$, где значениями переменной $$x$$ являются вершины, отличные от $$a$$, а значениями переменной $$X$$ - $$k$$ -элементные подмножества множества $$VG-\{ a\}$$, причем вершина $$x$$ не должна принадлежать множеству $$X$$. Эти функции определяются так: полагаем $$H_{k} (x,X)=1$$, если существует простой путь длины $$k+1$$ из вершины $$a$$ в вершину $$x$$, проходящий только через вершины из множества $$X$$, и $$H_{k} (x,X)=0$$, если такого пути не существует. Тогда
$$H_{0} (x,\varnothing)=A(a,x) \qquad \text{для всех } x,$$а для $$k>0$$
$$H_{k} (x,X)=\mathop{\vee}\limits_{y\in X} H_{k-1} (y,X-y)A(y,x). }$$Таким образом, зная все значения функции $$H_{k-1}$$, мы можем вычислить все значения функции $$H_{k}$$, причем для вычисления одного значения требуется выполнить $$2k-1$$ логических операций. Общее количество логических операций для вычисления всех этих функций составит
$$(n-1)\suml_{k=1}^{n-2}\begin{pmatrix} {n-2} \\ k \end{pmatrix} (2k-1)=(n-1)(2^{n-2} (n-3)+1)=O(n^{2} 2^{n}).$$После того, как будет вычислена функция $$H_{n-2}$$, останется
только для
всех $$x$$, для которых $$H_{n-2} (x,X)=1$$
( $$X$$ в этом случае
определяется однозначно), выяснить, чему равно $$A(x,a)$$ -
если хотя бы
в одном случае это 1, то
Для получения официальных документов о завершении программы дополнительного профессионального образования (удостоверения о повышении квалификации, дипломов о профессиональной переподготовке и MBA) необходимо предоставить:
Внимание! Вы можете не заказывать доставку бумажной версии официального документы, а скачать его в электронном виде и распечатать самостоятельно. Информация о выданном документе в течение 1 месяца загружается в Федеральную информационную систему «Федеральный реестр сведений о документах об образовании и (или) о квалификации, документах об обучении» - ФИС ФРДО.
Доступ на новый сайт осуществляется с использованием адреса электронной почты, который был указан вами при регистрации на "старом". Мы постарались перенести все ваши данные с прежнего ресурса, однако не исключена вероятность потери части информации.
При возникновении проблемы со входом, воспользуйтесь функцией сброса пароля
Если вы обнаружите несоответствия, пожалуйста, сообщите нам.