У меня есть связанный, ненаправленный граф с N узлами и 2N-3 ребрами. Вы можете рассматривать граф так, как будто он построен на существующем исходном графе, который имеет 3 узла и 3 ребра. Каждый узел добавлен в граф и имеет 2 соединения с существующими узлами в графе. Когда все узлы добавлены к графу (всего добавлено N-3 узлов), строится окончательный граф.
Первоначально меня спрашивают, какое максимальное количество узлов в этом графе можно посетить ровно один раз (за исключением начального узла), то есть каково максимальное количество узлов, содержащихся в наибольшем гамильтоновом пути данного графа? (Хорошо, сказать, что наибольший гамильтонов путь - неверная фраза, но, учитывая характер вопроса, мне нужно найти максимальное количество узлов, которые посещаются один раз, и поездка заканчивается на начальном узле. Я думал, что это может быть рассматривается как подграф, который является гамильтоновым и состоит из максимального числа узлов, таким образом, наибольший возможный гамильтонов путь).
Поскольку меня не просят найти путь, я должен сначала проверить, существует ли гамильтонов путь для данного количества узлов. Я знаю, что планарные графы и циклический график s (C n) являются гамильтоновы графы (я также знаю теорему Оре для гамильтоновых графов, но с графом я буду работать on не будет плотным графом с большой вероятностью, что делает теорему Оре практически бесполезной в моем случае). Поэтому мне нужно найти алгоритм для проверки того, является ли граф циклическим графом, т.е. существует ли цикл, который содержит все узлы данного графа.
Поскольку 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 даст правильный результат? Можете ли вы подтвердить это или в этом алгоритме есть изъян?