关闭

HDU-2181-哈密顿绕行世界问题(DFS)

标签: DFS
148人阅读 评论(0) 收藏 举报
分类:

哈密顿绕行世界问题

Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 3408 Accepted Submission(s): 2092

Problem Description
一个规则的实心十二面体,它的 20个顶点标出世界著名的20个城市,你从一个城市出发经过每个城市刚好一次后回到出发的城市。

Input
前20行的第i行有3个数,表示与第i个城市相邻的3个城市.第20行以后每行有1个数m,m<=20,m>=1.m=0退出.

Output
输出从第m个城市出发经过每个城市1次又回到m的所有路线,如有多条路线,按字典序输出,每行1条路线.每行首先输出是第几条路线.然后个一个: 后列出经过的城市.参看Sample output

Sample Input
2 5 20
1 3 12
2 4 10
3 5 8
1 4 6
5 7 19
6 8 17
4 7 9
8 10 16
3 9 11
10 12 15
2 11 13
12 14 20
13 15 18
11 14 16
9 15 17
7 16 18
14 17 19
6 18 20
1 13 19
5
0

Sample Output
1: 5 1 2 3 4 8 7 17 18 14 15 16 9 10 11 12 13 20 19 6 5
2: 5 1 2 3 4 8 9 10 11 12 13 20 19 18 14 15 16 17 7 6 5
3: 5 1 2 3 10 9 16 17 18 14 15 11 12 13 20 19 6 7 8 4 5
4: 5 1 2 3 10 11 12 13 20 19 6 7 17 18 14 15 16 9 8 4 5
5: 5 1 2 12 11 10 3 4 8 9 16 15 14 13 20 19 18 17 7 6 5
6: 5 1 2 12 11 15 14 13 20 19 18 17 16 9 10 3 4 8 7 6 5
7: 5 1 2 12 11 15 16 9 10 3 4 8 7 17 18 14 13 20 19 6 5
8: 5 1 2 12 11 15 16 17 18 14 13 20 19 6 7 8 9 10 3 4 5
9: 5 1 2 12 13 20 19 6 7 8 9 16 17 18 14 15 11 10 3 4 5
10: 5 1 2 12 13 20 19 18 14 15 11 10 3 4 8 9 16 17 7 6 5
11: 5 1 20 13 12 2 3 4 8 7 17 16 9 10 11 15 14 18 19 6 5
12: 5 1 20 13 12 2 3 10 11 15 14 18 19 6 7 17 16 9 8 4 5
13: 5 1 20 13 14 15 11 12 2 3 10 9 16 17 18 19 6 7 8 4 5
14: 5 1 20 13 14 15 16 9 10 11 12 2 3 4 8 7 17 18 19 6 5
15: 5 1 20 13 14 15 16 17 18 19 6 7 8 9 10 11 12 2 3 4 5
16: 5 1 20 13 14 18 19 6 7 17 16 15 11 12 2 3 10 9 8 4 5
17: 5 1 20 19 6 7 8 9 10 11 15 16 17 18 14 13 12 2 3 4 5
18: 5 1 20 19 6 7 17 18 14 13 12 2 3 10 11 15 16 9 8 4 5
19: 5 1 20 19 18 14 13 12 2 3 4 8 9 10 11 15 16 17 7 6 5
20: 5 1 20 19 18 17 16 9 10 11 15 14 13 12 2 3 4 8 7 6 5
21: 5 4 3 2 1 20 13 12 11 10 9 8 7 17 16 15 14 18 19 6 5
22: 5 4 3 2 1 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5
23: 5 4 3 2 12 11 10 9 8 7 6 19 18 17 16 15 14 13 20 1 5
24: 5 4 3 2 12 13 14 18 17 16 15 11 10 9 8 7 6 19 20 1 5
25: 5 4 3 10 9 8 7 6 19 20 13 14 18 17 16 15 11 12 2 1 5
26: 5 4 3 10 9 8 7 17 16 15 11 12 2 1 20 13 14 18 19 6 5
27: 5 4 3 10 11 12 2 1 20 13 14 15 16 9 8 7 17 18 19 6 5
28: 5 4 3 10 11 15 14 13 12 2 1 20 19 18 17 16 9 8 7 6 5
29: 5 4 3 10 11 15 14 18 17 16 9 8 7 6 19 20 13 12 2 1 5
30: 5 4 3 10 11 15 16 9 8 7 17 18 14 13 12 2 1 20 19 6 5
31: 5 4 8 7 6 19 18 17 16 9 10 3 2 12 11 15 14 13 20 1 5
32: 5 4 8 7 6 19 20 13 12 11 15 14 18 17 16 9 10 3 2 1 5
33: 5 4 8 7 17 16 9 10 3 2 1 20 13 12 11 15 14 18 19 6 5
34: 5 4 8 7 17 18 14 13 12 11 15 16 9 10 3 2 1 20 19 6 5
35: 5 4 8 9 10 3 2 1 20 19 18 14 13 12 11 15 16 17 7 6 5
36: 5 4 8 9 10 3 2 12 11 15 16 17 7 6 19 18 14 13 20 1 5
37: 5 4 8 9 16 15 11 10 3 2 12 13 14 18 17 7 6 19 20 1 5
38: 5 4 8 9 16 15 14 13 12 11 10 3 2 1 20 19 18 17 7 6 5
39: 5 4 8 9 16 15 14 18 17 7 6 19 20 13 12 11 10 3 2 1 5
40: 5 4 8 9 16 17 7 6 19 18 14 15 11 10 3 2 12 13 20 1 5
41: 5 6 7 8 4 3 2 12 13 14 15 11 10 9 16 17 18 19 20 1 5
42: 5 6 7 8 4 3 10 9 16 17 18 19 20 13 14 15 11 12 2 1 5
43: 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 1 2 3 4 5
44: 5 6 7 8 9 16 17 18 19 20 1 2 12 13 14 15 11 10 3 4 5
45: 5 6 7 17 16 9 8 4 3 10 11 15 14 18 19 20 13 12 2 1 5
46: 5 6 7 17 16 15 11 10 9 8 4 3 2 12 13 14 18 19 20 1 5
47: 5 6 7 17 16 15 11 12 13 14 18 19 20 1 2 3 10 9 8 4 5
48: 5 6 7 17 16 15 14 18 19 20 13 12 11 10 9 8 4 3 2 1 5
49: 5 6 7 17 18 19 20 1 2 3 10 11 12 13 14 15 16 9 8 4 5
50: 5 6 7 17 18 19 20 13 14 15 16 9 8 4 3 10 11 12 2 1 5
51: 5 6 19 18 14 13 20 1 2 12 11 15 16 17 7 8 9 10 3 4 5
52: 5 6 19 18 14 15 11 10 9 16 17 7 8 4 3 2 12 13 20 1 5
53: 5 6 19 18 14 15 11 12 13 20 1 2 3 10 9 16 17 7 8 4 5
54: 5 6 19 18 14 15 16 17 7 8 9 10 11 12 13 20 1 2 3 4 5
55: 5 6 19 18 17 7 8 4 3 2 12 11 10 9 16 15 14 13 20 1 5
56: 5 6 19 18 17 7 8 9 16 15 14 13 20 1 2 12 11 10 3 4 5
57: 5 6 19 20 1 2 3 10 9 16 15 11 12 13 14 18 17 7 8 4 5
58: 5 6 19 20 1 2 12 13 14 18 17 7 8 9 16 15 11 10 3 4 5
59: 5 6 19 20 13 12 11 10 9 16 15 14 18 17 7 8 4 3 2 1 5
60: 5 6 19 20 13 14 18 17 7 8 4 3 10 9 16 15 11 12 2 1 5

简单的深搜,前序遍历一遍树,并记录路径即可
注意最后还是要回到起点的。

#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<string.h>
#include<math.h>
using namespace std;
const int maxn=22;
int map[maxn][maxn];
int path[maxn];
int casen;
int M;

void DFS(int point,int num)//传入当前搜索的顶点编号和已搜索顶点数量和输出编号
{
    if(num==20&&map[point][M]==1)//顶点数量足够且最后一个顶点可以回到起点
    {
        int str[maxn];
        int len=0;
        for(int i=point;path[i]!=-1;i=path[i])
            str[len++]=i;
        printf("%d: ",casen++);
        for(int i=len-1;i>=0;i--)
            printf(" %d",str[i]);
        printf(" %d\n",M);
    }
    for(int i=1; i<=20; i++)
        if(map[i][point]==1&&path[i]==-1)
        {
            path[i]=point;
            DFS(i,num+1);
            path[i]=-1;
        }
}
int main()
{
    memset(map,0,sizeof(map));
    for(int i=1; i<=20; i++)
    {
        int a,b,c;
        scanf("%d%d%d",&a,&b,&c);
        map[i][a]=1;
        map[i][b]=1;
        map[i][c]=1;
        map[a][i]=1;
        map[b][i]=1;
        map[c][i]=1;
    }
//    for(int i=1; i<=20; i++)
//    {
//        for(int j=1; j<=20; j++)
//            printf("%d ",map[i][j]);
//        printf("\n");
//    }
    while(scanf("%d",&M)&&M)
    {
        memset(path,-1,sizeof(path));//未遍历过的顶点标记为-1
        path[M]=0;//标记M已遍历
        casen=1;
        DFS(M,1);
    }
    return 0;
}
0
0
查看评论

HDU-2181 哈密顿绕行世界问题

题目: http://acm.hdu.edu.cn/showproblem.php?pid=2181 题意: TSP问题,20个城市,每个城市与三个城市相连,输出从某个城市开始遍历所有城市的所有路径的字典序排列。 思路: 按字典序暴力dfs即可, 代码: #define N 25 i...
  • kopyh
  • kopyh
  • 2015-09-25 22:16
  • 542

哈密顿绕行世界问题

Problem Description 一个规则的实心十二面体,它的 20个顶点标出世界著名的20个城市,你从一个城市出发经过每个城市刚好一次后回到出发的城市。   Input 前20行的第i行有3个数,表示与第i个城市相邻的3个城市.第20行以后每行有1个数m...
  • a997930294
  • a997930294
  • 2014-07-26 09:57
  • 1057

hdu2181C - 哈密顿绕行世界问题

http://acm.hdu.edu.cn/showproblem.php?pid=2181 这是一个dfs搜索题目,难点在于剪枝,以及路径还原;下面是给出代码及其详解 /* 回溯方法的深度理解 9->3->2->13->5->head pre[9]=3; pre[...
  • yuanjunlai141
  • yuanjunlai141
  • 2015-10-24 20:21
  • 293

hdu 2181 哈密顿绕行世界问题,深度优先搜索求解

http://acm.hdu.edu.cn/showproblem.php?pid=2181         这是我写的第一个博客,仅作为参考,大牛们见了不要见笑哈。         本题首先就是要建立一个城市连接的...
  • wchyumo2009
  • wchyumo2009
  • 2012-03-22 20:16
  • 2790

HDOJ 2181 哈密顿绕行世界问题

题意:有二十个节点,求出不重复的遍历所有节点的所有路径,按字典序输出路径 链接:http://acm.hdu.edu.cn/showproblem.php?pid=2181 思路:回溯+dfs 注意点:注意起点和终点的处理 以下为AC代码: #include #include ...
  • luminous11
  • luminous11
  • 2015-03-17 22:26
  • 281

HDU-2181-哈密顿绕行世界问题 [dfs]

题目传送门#include <algorithm> #include <iostream> #include <cstring> #include <cstdlib> #include <cstdio> #include <cmath...
  • L524922464
  • L524922464
  • 2017-05-21 10:31
  • 309

HDU-2181-哈密顿绕行世界问题(DFS)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2181 哈密顿绕行世界问题 Problem Description 一个规则的实心十二面体,它的 20个顶点标出世界著名的20个城市,你从一个城市出发经过每个城市刚好一次后回到出发的...
  • m0_37345402
  • m0_37345402
  • 2017-07-22 19:21
  • 83

HDU-2181-哈密顿绕行世界问题

哈密顿绕行世界问题 Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 1254 ...
  • Y_liuzhenyuan
  • Y_liuzhenyuan
  • 2014-10-15 17:17
  • 196

hdu 2181 哈密顿绕行世界问题 dfs

B - 哈密顿绕行世界问题 Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u...
  • HowardEmily
  • HowardEmily
  • 2016-10-23 15:43
  • 231

HDU2181---哈密顿绕行世界问题

#include #include using namespace std; int map[25][4],vis[25],des[25]; int n,cas=1; void dfs(int now,int num){ if(num>21) return; if(num==...
  • hy1405430407
  • hy1405430407
  • 2015-06-15 20:56
  • 461
    个人资料
    • 访问:142350次
    • 积分:5532
    • 等级:
    • 排名:第5729名
    • 原创:415篇
    • 转载:6篇
    • 译文:0篇
    • 评论:46条
    最新评论