首页 > 代码库 > 哈密尔顿环

哈密尔顿环

 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 }

 

哈密尔顿环