哈密顿路

邮递员在送信时,为了节省路途,自己规定:每次总是从n 个村子中选择其中一个合适的村子出发,途中每个村子仅且经过一次,送完所有的信。已知各个村子的道路连通情况。
输出所有符合要求的路线。如果没有输出“no road”。

【输入】
第一行:整数n:村子的个数。
接下来是一个n*n 的0、1 矩阵,表示n 个村子的连同情况,如:a[i,j]=1 ,表示第i 和第j 个村子之间有路可走,如果a[i,j]=0,表示他们之间无路可走。

【输出】

按序号从小到大输出所有可行的线路

输入:

7
0 1 0 1 1 0 0
1 0 1 0 1 0 0
0 1 0 0 0 0 1
1 0 0 0 0 0 0
1 1 0 0 0 1 0
0 0 0 0 1 0 1
0 0 1 0 0 1 0
输出:
2 3 7 6 5 1 4
3 7 6 5 2 1 4
4 1 2 3 7 6 5
4 1 2 5 6 7 3
4 1 5 2 3 7 6
4 1 5 6 7 3 2
5 6 7 3 2 1 4
6 7 3 2 5 1 4

 

一道很水的深搜题。

但有几点要注意一下,就是每一次递归都应该先记录路径,然后判断下一步该怎么走。而不是找出下一个能在走到的点,再记录这个点。因为否则的话最后一个点就添加不到了。

 

还有一个优化的地方,就是可以用 vector 代替邻接矩阵存图。

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<iostream>
 4 #include<cmath>
 5 #include<algorithm>
 6 #include<vector> 
 7 using namespace std;
 8 #define rep(i, a, n) for(int i = a; i <= n; ++i)
 9 #define per(i, n, a) for(int i = n; i >= a; --i)
10 typedef long long ll;
11 const int maxn = 1e5 + 5;
12 
13 vector<int>v[maxn];
14 int n, vis[maxn], road[maxn], pos = 0;
15 bool con[maxn], flag = true;
16 void init()
17 {
18     memset(vis, 0, sizeof(vis));
19     memset(road, 0, sizeof(road));
20     pos = 0; flag = false;
21 }
22 void print()
23 {
24     rep(i, 1, pos) printf("%d%c", road[i], i == pos ? '\n' : ' ');
25     flag = true;
26 }
27 int dfs(int x, int step)
28 {
29     vis[x] = 1;
30     road[++pos] = x;
31     if(step == n) print();
32     rep(i, 0, v[x].size() - 1)
33     {
34         int newx = v[x][i];
35         if(!vis[newx])
36         {
37             dfs(newx, step + 1);
38             pos--; vis[newx] = 0;
39         }
40     }
41 }
42 int main()
43 {
44     freopen("hamilton.in", "r", stdin);
45     freopen("hamilton.out", "w", stdout);
46     scanf("%d", &n);
47     rep(i, 1, n)
48         rep(j, 1, n)
49         {
50             int x; scanf("%d", &x);
51             if(x) {v[i].push_back(j); con[i] = 1;}
52         }
53     rep(i, 1, n)
54         if(con[i])
55         {
56             init();
57             dfs(i, 1);
58         }
59     if(!flag) printf("no road\n");
60     return 0;
61 }

 

posted @ 2018-03-21 19:14  mrclr  阅读(319)  评论(0编辑  收藏  举报