哈密尔顿环
1 #include<iostream> 2 #include<cstring> 3 using namespace std; 4 int start,length,x,n; 5 bool visited[101],v1[101]; 6 int ans[101], num[101]; 7 int g[101][101]; 8 void print() { 9 int i; 10 for (i = 1; i <= length; i++) 11 cout << ' ' << ans[i]; 12 cout << endl; 13 } 14 void dfs(int last,int i) 15 //访问点i,last表示上次访问的点 16 { 17 visited[i] = true; //标记为已经访问过 18 v1[i] = true; //标记为已在一张图中出现过,不用回溯 19 ans[++length] = i; //记录下答案 20 for (int j = 1; j <= num[i]; j++) 21 { 22 if (g[i][j]==x && g[i][j]!=last) 23 { //回到起点,构成哈密尔顿环 24 ans[++length] = g[i][j]; 25 print(); //这里说明找到了一个环,则输出ans数组。 26 length--; 27 break; 28 } 29 if (!visited[g[i][j]]) dfs(i,g[i][j]);//遍历与i相关联所有未访问过的顶点 30 } 31 length--; 32 visited[i] = false; //这里是回溯过程,注意v1的值不恢复。 33 } 34 int main() { 35 cin>>n; 36 int m; 37 cin>>m; 38 for(int i=1; i<=m; i++) { 39 int x,y; 40 cin>>x>>y; 41 g[x][++num[x]]=y;//此x点能够通往几条边,边 42 g[y][++num[y]]=x;//此y点能够通往几条边,边 43 } 44 for (x = 1; x <= n; x++) 45 //每一个点都作为起点尝试访问,因为不是从任何一点开始都能找过整个图的 46 if (!v1[x]) { //如果点x不在之前曾经被访问过的图里。 47 length = 0; //定义一个ans数组存答案,length记答案的长度。 48 dfs(0,x); 49 } 50 return 0; 51 }