Я знаю, что проверка гамильтонианских путей-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