Реализация кода для проверки гамильтонианского пути (O (n)) [закрыто]C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Реализация кода для проверки гамильтонианского пути (O (n)) [закрыто]

Сообщение Anonymous »

Я знаю, что проверка гамильтонианских путей-NP-Hard. Я написал реализацию, которая использует DFS и поддерживает переменную подсчета для количества изучаемых узлов. DFS строит дерево, и моя интуиция проверяла, существует ли узел листового узла, и не является исследованным NTH Node (n = количество узлов на графике). Это подразумевает, что существует гамильтонского цикла. Достигнув листового узла дерева, есть два случая, если это прямой путь и имеет задний край до корневого, существует гамильтонский цикл. Иначе, должен быть перекрестный срок для какого -то другого узла, кроме его предка (не предка, потому что он уже был изучен, и мы можем посетить узел только один раз, кроме корневого узла). В конце концов, после того, как все узлы исследуются, нам нужно быть на листовом узле, который имеет быстрый обзор корневого узла, который завершает наш гамильтонский цикл. Посещение (num_visited). < /p>
< /li>
Если в любой момент вы достигаете листа (узел без неопубликованных соседей), но num_visited (узлы)
#include
using namespace std;

const int MAX_N = 100;
vector graph[MAX_N];
bool visited[MAX_N];
vector path;
bool possible = true;
int num_visited = 0;

// DFS function
void dfs(int node, int total_nodes) {
visited[node] = true;
num_visited++;

bool has_unvisited_neighbor = false;

for (int neighbor : graph[node]) {
if (!visited[neighbor]) {
has_unvisited_neighbor = true;
dfs(neighbor, total_nodes);
}
}

// If we reach a leaf before visiting all nodes, we assume failure
if (!has_unvisited_neighbor && num_visited < total_nodes) {
possible = false;
}

path.push_back(node);
}

int main() {
int n = 5; // total nodes
int m = 5; // total edges

// Example graph
// 1 - 2 - 3
// |
// 4 - 5

graph[1] = {2};
graph[2] = {1, 3, 4};
graph[3] = {2};
graph[4] = {2, 5};
graph[5] = {4};

dfs(1, n);

if (!possible || num_visited != n) {
cout

Подробнее здесь: https://stackoverflow.com/questions/796 ... ian-pathon
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»