Как определить, имеет ли данный граф цикл, содержащий все его узлы? Имеет ли предложенный алгоритм какие-либо недостатки?
У меня есть связный, не направленный граф с N узлами и 2n-3 ребрами. Вы можете рассмотреть график, как он построен на существующем начальном графике, который имеет 3 узла и 3 ребра. Каждый узел добавлен на график и имеет 2 соединения с существующими узлами на графике. Когда все узлы добавляются к графу (Всего добавлено N-3 узла), строится окончательный граф.
первоначально меня спрашивают, какое максимальное количество узлов в этом графике можно посетить ровно один раз (за исключением начального узла), т. е. Каково максимальное число узлов, содержащихся в наибольшем Гамильтоновом пути данного графа? (хорошо, говоря, что самый большой Гамильтонов путь не является допустимой фразой, но, учитывая природу вопроса, мне нужно найти Макс. количество узлов, которые посещаются один раз, и поездка заканчивается на начальном узле. Я думал, что его можно рассматривать как подграф, который является Гамильтоновым и состоит из max. число узлов, таким образом, максимально возможный гамильтониан путь.)
поскольку меня не просят найти путь, я должен сначала проверить, существует ли Гамильтонов путь для заданного числа узлов. Я знаю, что плоские графики и график рабочего циклаs (Cn) являются гамильтоновыми графами (я также знаю теорема ОРЭ для гамильтоновых графов, но граф, над которым я буду работать, не будет плотным графом с большой вероятностью, что делает теорему Оре практически бесполезной в моем случае). Поэтому мне нужно найти алгоритм проверки, является ли граф циклом, т. е. существует ли цикл, содержащий все узлы данного графа.
поскольку DFS используется для обнаружения циклов, я подумал, что некоторые незначительные манипуляции с DFS могут помочь мне обнаружить то, что я ищу, как в отслеживании исследуемых узлов, и, наконец, проверка, если последний посещенный узел имеет соединение с начальным узлом. К сожалению Я не мог добиться успеха с таким подходом.
другой подход, который я пробовал, был исключая узел, а затем попробуйте добраться до соседнего узла, начиная с другого соседнего узла. Этот алгоритм может не давать правильных результатов в соответствии с выбранными смежными узлами.
Я в значительной степени застрял здесь. Можете ли вы помочь мне придумать другой алгоритм, чтобы сказать мне, является ли график циклом?
редактировать
Я понял, с помощью комментария (спасибо за это Н.м.):
график цикла состоит из один цикл и имеет N ребер и n вершин. Если существует цикл, содержащий все узлы данного графа, то это Гамильтонов цикл. – Н.м.
что я на самом деле поиск Гамильтонова пути, который я не собирался делать:) Во-вторых, я думаю, что проверка Гамильтонова свойства графа при его построении будет более эффективной, что я также ищу: эффективность времени.
подумав, я подумал каким бы ни было количество узлов, граф кажется Гамильтоновым из-за критериев добавления узлов. Проблема в том, что я не уверен и не могу это доказать. Изменяет ли добавление узлов таким образом, т. е. добавление новых узлов с 2 ребрами, которые соединяют добавленный узел с существующими узлами, свойство Гамильтона графа? Если это не изменяет свойство Гамильтона,то как? Если она изменится, то как? Спасибо.
правка #2
Я, опять же, понял это построение графа так, как я описал, может изменить свойство Гамильтона. Рассмотрим ввод данных следующим образом:
1 3
2 3
1 5
1 3
эти входные данные говорят, что 4-й узел подключен к узлу 1 и узлу 3, 5-й к узлу 2 и узлу 3 . . .
4-й и 7-й узлы подключены к одним и тем же узлам, что снижает максимальное количество узлов, которые можно посетить ровно один раз, на 1. Если я обнаружу эти столкновения (не включая входные данные, такие как 3 3, что является примером это вы предложили, так как проблема гласит, что вновь добавленные ребра подключены к 2 других узла) и снизить максимальное количество узлов, начиная с N, я считаю, что могу получить правильный результат.
видите ли, я не выбираю соединения, они даны мне, и я должен найти максимум. число узлов.
Я думаю, что подсчет одинаковых соединений при построении графика и вычитание числа одинаковых соединений из N даст правильный результат? Можете ли вы подтвердить это или есть недостаток в этом алгоритме?
3 ответов
чтобы добавить некоторое уточнение к этому потоку: нахождение Гамильтонова цикла NP-завершено, что означает, что нахождение самого длинного цикла также NP-завершено, потому что, если мы можем найти самый длинный цикл в любом графе, мы можем найти Гамильтонов цикл подграфа, индуцированный вершинами, лежащими на этом цикле. (См. Также, например,этой статье относительно самой длинной проблемы цикла)
мы не можем использовать критерий Дирака здесь: Дирак только говорит нам minimum degree >= n/2 -> Hamiltonian Cycle
, что является импликация в противоположном направлении от того, что нам нужно. Другой способ определенно неправильный: возьмите цикл над n
вершины, каждая вершина в нем имеет ровно степень 2, независимо от размера круга, но она имеет (есть) HC. То, что вы можете сказать от Дирака, это no Hamiltonian Cycle -> minimum degree < n/2
, что здесь бесполезно, так как мы не знаем, имеет ли наш граф HC или нет, поэтому мы не можем использовать импликацию (тем не менее каждый граф, который мы строим в соответствии с тем, что op описал, будет иметь вершину степени 2
, а именно последняя вершина, добавленная в граф, поэтому для произвольного n
, мы имеем минимальную степень 2
).
проблема в том, что вы можете построить как графики произвольного размера, которые имеют HC, так и графики произвольного размера, которые не имеют HC. Для первой части: если исходный треугольник A,B, C и добавленные вершины пронумерованы от 1 до k, то соедините 1-ю добавленную вершину с A и C и K+1-ю вершину с A и k-ю вершину для всех k >= 1. Цикл A,B,C,1,2,...,k,A
. Для второй части соедините обе вершины 1 и 2 С A и B; этот граф не имеет HC.
что также важно отметить, так это то, что свойство наличия HC может меняться от одной вершины к другой во время строительства. Вы можете создавать и уничтожать свойство HC при добавлении вершины, поэтому вам придется проверять его каждый раз при добавлении вершины. Простой пример: возьмите график после добавления 1-й вершины и добавьте вторую вершину вместе с ребрами к тем же двум вершины треугольника, к которому была присоединена 1-я вершина. Это строит из графика с HC график без HC. Другой способ: добавьте теперь 3-ю вершину и соедините ее с 1 и 2; это строит из графа без HC граф с HC.
Хранение последнего известного HC во время строительства на самом деле не поможет вам, потому что оно может полностью измениться. Вы могли бы ХК после 20-й вершины, затем нет для K в [21,2000], и опять за 2001-го добавлена вершина. Скорее всего, HC, который у вас был на 23 вершинах, не поможет вам много.
если вы хотите выяснить, как решить эту проблему эффективно, вам нужно будет найти критерии, которые работают для всех ваших графиков, которые можно проверить эффективно. В противном случае ваша проблема не кажется мне более простой, чем проблема Гамильтонова цикла в общем случае, поэтому вы можете настроить один из алгоритмов используется для этой проблемы в свой вариант.
что мы имеем в этом проблема connected, non-directed
граф N узлы и 2N-3 края. Рассмотрим график, приведенный ниже,
A
/ \
B _ C
( )
D
Граф не имеет Гамильтонова цикла. Но график построен в соответствии с вашими правилами добавления узлов. Поэтому поиск Гамильтонова цикла может не дать вам решения. Более того, даже если возможно обнаружение Гамильтонова цикла является NP-Complete проблема с O (2N) сложности. Таким образом, подход может быть не идеальным.
Я предлагаю использовать модифицированную версию Floyd's Cycle Finding algorithm
(также называемый ).
модифицированный алгоритм,
1. Initialize a List CYC_LIST to ∅.
2. Add the root node to the list CYC_LIST and set it as unvisited.
3. Call the function Floyd() twice with the unvisited node in the list CYC_LIST for each of the two edges. Mark the node as visited.
4. Add all the previously unvisited vertices traversed by the Tortoise pointer to the list CYC_LIST.
5. Repeat steps 3 and 4 until no more unvisited nodes remains in the list.
6. If the list CYC_LIST contains N nodes, then the Graph contains a Cycle involving all the nodes.
алгоритм вызывает алгоритм поиска цикла Флойда максимум 2N раз. Алгоритм поиска цикла Флойда занимает линейное время(O (N) ). Таким образом, сложность модифицированного алгоритма O (N2) что намного лучше, чем экспоненциальное время, принятое подходом, основанным на Гамильтоновом цикле.
одна из возможных проблем с этим подходом заключается в том, что он обнаружит closed paths
вместе с циклами, если не будут реализованы более строгие критерии проверки.
ответить на редактирование #2
рассмотрим график, приведенный ниже,
A------------\
/ \ \
B _ C \
|\ /| \
| D | F
\ / /
\ / /
E------------/
согласно вашему алгоритму, этот график не имеет цикла, содержащего все узлы. Но есть цикл в этом графе содержатся все узлы.
A-B-D-C-E-F-A
поэтому я думаю, что есть некоторый недостаток в вашем подходе. Но предположим, если ваш алгоритм верен, это намного лучше, чем мой подход. Так как мой берет O (n2) время, где как твое занимает всего O (n).
ниже я добавил три дополнительных узла (3,4,5) в исходный граф, и кажется, что я могу продолжать добавлять новые узлы бесконечно, сохраняя при этом свойство Гамильтонова цикла. Для приведенного ниже графика цикл будет 0-1-3-5-4-2-0
1---3---5
/ \ / \ /
0---2---4
поскольку не было никаких дополнительных ограничений о том, как вы можете добавить новый узел с двумя ребрами, я думаю, что по конструкции вы можете иметь граф, который содержит свойство гамильтонова цикла.