哈密顿回路是一条哈密顿路径,使得从哈密顿路径的最后一个顶点到第一个顶点有一条边(在图中)。在无向图中,有一条路径只访问图的每个顶点一次。
Begin 1. function isSafe() is used to check for whether it is adjacent to the previously added vertex and already not added. 2. function hamiltonianCycle() solves the hamiltonian problem. 3. function hamCycle() uses hamiltonianCycle() to solve the hamiltonian problem. It returns false if there is no Hamiltonian Cycle possible, otherwise return true and prints the path. End
#include <iostream> #include <cstdio> #include <cstdlib> #define N 5 using namespace std; void displaytheSolution(int path[]); bool isSafe(int n, bool g[N][N], int path[], int pos) { if (g [path[pos-1]][n] == 0) return false; for (int i = 0; i < pos; i++) if (path[i] == n) return false; return true; } bool hamiltonianCycle(bool g[N][N], int path[], int pos) { //如果所有顶点都包含在哈密顿循环中 if (pos == N) { if (g[ path[pos-1] ][ path[0] ] == 1) return true; else return false; } for (int n = 1; n < N; n++) { if (isSafe(n, g, path, pos)) { //检查这个顶点是否可以添加到哈密顿循环 path[pos] = n; //recur 以构建路径的其余部分 if (hamiltonianCycle (g, path, pos+1) == true) return true; path[pos] = -1; //如果它不会导致解决方案,则删除顶点 } } return false; } bool hamCycle(bool g[N][N]) { int *path = new int[N]; for (int i = 0; i < N; i++) path[i] = -1; //将顶点 0 作为路径中的第一个顶点。如果存在哈密顿循环,则路径可以从任意点开始 //由于图是无向图的循环 path[0] = 0; if (hamiltonianCycle(g, path, 1) == false) { cout<<"\nCycle does not exist"<<endl; return false; } displaytheSolution(path); return true; } void displaytheSolution(int p[]) { cout<<"循环存在:"; cout<<" Following is one Hamiltonian Cycle \n"<<endl; for (int i = 0; i < N; i++) cout<<p[i]<<" "; cout<< p[0]<<endl; } int main() { bool g[N][N] = {{0, 1, 0, 1, 1}, {0, 0, 1, 1, 0}, {0, 1, 0, 1, 1}, {1, 1, 1, 0, 1}, {0, 1, 1, 0, 0}, }; hamCycle(g); return 0; }输出结果
循环存在: Following is one Hamiltonian Cycle 0 4 1 2 3 0