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 }