定义:
指的是不重复走过所有的点。并且最后还能回到起点的路。
简单的深度优先搜索就能求出一张图中所有的哈密尔顿环
1 #include <iostream> 2 #include <algorithm> 3 #include <cstring> 4 5 using namespace std; 6 int start, length,x,n; 7 const int maxn = 101; 8 bool visited[maxn], v1[maxn]; 9 int ans[maxn], num[maxn]; 10 int g[maxn][maxn]; 11 void print() 12 { 13 for (int i = 1; i <= length - 1; ++ i) 14 { 15 cout << ans[i] << " "; 16 } 17 cout << ans[length] << endl; 18 } 19 20 void dfs(int last, int i)//用数组模拟邻接表存储,访问点i,last标是上一个访问的点。 21 { 22 visited[i] = true;//比哦及为已经访问过的点 23 vl[i] = true;//标记已经出现在一张图中点 24 ans[++length] = i;//记录下答案 25 for (int j = 1; j <= num[i]; ++ j) 26 { 27 if (g[i][j] == x && g[i][j] != last)//回到起点构成哈密顿环 28 { 29 ans[++length] = g[i][j]; 30 print();//这里说明找到了一个环 31 length--; 32 break; 33 } 34 if (!visited[g[i][j]]) dfs[i] = false; 35 } 36 length--; 37 visited[i] = false;//这里是回溯 38 } 39 40 int main() 41 { 42 memset(visited, false, sizeof(visited)); 43 memset(vl, false, sizeof(vl)); 44 for (x = 1; x <= n; ++ x)//每个点都做为起点尝试访问,因为不是从任何一点开始都能找到过整个图。 45 { 46 if (!vl[x])//如果点x没被之前的图访问过 47 { 48 length = 0; //定义一个ans数组存答案,length记录长度 49 dfs(0, x); 50 } 51 } 52 return 0; 53 }