zoukankan      html  css  js  c++  java
  • 哈密顿路

    邮递员在送信时,为了节省路途,自己规定:每次总是从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 ? '
    ' : ' ');
    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
    ");
    60     return 0;
    61 }
  • 相关阅读:
    表相关操作
    表的约束
    windows平台MySQL安装
    网络编程2
    Python元类
    并发编程这个只是占位使用而已
    并发编程2
    并发编程1
    Mac装机神器Homebrew
    基于Django框架开发BBS项目
  • 原文地址:https://www.cnblogs.com/mrclr/p/8619020.html
Copyright © 2011-2022 走看看