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

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 #include <iostream>
 2
 3 using namespace std;
 4
 5 int Map[21][21] = { 0 };  //邻接矩阵
 6 int path[21];              //记录每一次答案的路线
 7 bool visited[21] = { false };
 8 int num = 1; //路径的编号
 9
10
11 void dfs(int city, int cur) //city为当前访问的城市,已经访问了cur个城市
12 {
13     path[cur] = city;    //将当前城市记录在路径上
14     visited[city] = true;
15
16     if (cur == 20)        //如果已经访问了20个城市
17     {
18         if (Map[city][path[1]] == 1)    //这个城市与起点城市之间存在路径
19         {
20             cout << num << ":  ";
21             num++;
22             for (int i = 1; i <= 20; ++i)
23                 cout << path[i] << ‘ ‘;
24             cout << path[1] << endl;
25         }
26     }
27
28     for (int i = 1; i <= 20; ++i)
29     {
30         if (Map[i][city] == 1 && !visited[i])
31         {
32             dfs(i, cur+1);        //注意此处不能是++cur
33             visited[i] = false;    //dfs完要把访问过的顶点重新置为未访问状态
34         }
35     }
36
37 }
38
39
40 int main()
41 {
42     //创建邻接矩阵
43     int city;
44     for (int i = 1; i <= 20; ++i)
45     {
46         for (int j = 1; j <= 3; ++j)
47         {
48             cin >> city;
49             Map[i][city] = 1;
50         }
51     }
52
53     int m;
54     while (cin >> m && m != 0)
55     {
56         dfs(m, 1);
57         num = 1;
58     }
59
60
61     return 0;
62
63 }

原文地址:https://www.cnblogs.com/FengZeng666/p/10352790.html

时间: 2024-10-05 23:36:47

HDU 2181 哈密顿绕行世界问题 (dfs)的相关文章

HDU 2181 哈密顿绕行世界问题【DFS】

题意:给出一个十二面体,它的每个顶点是一个城市,从一个城市m出发并回到m,输出所有可行的路径 先把边记录下来,再深搜 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include <cmath> 5 #include<stack> 6 #include<vector> 7 #include<map> 8 #include<set>

HDU ACM 2181 哈密顿绕行世界问题-&gt;DFS(深度有限搜索)

分析:DFS即可. #include<iostream> using namespace std; bool map[21][21]; bool vis[21]; int ans[21],num,m; void init() { int i,a; memset(map,false,sizeof(map)); for(i=1;i<=20;i++) //构图 { map[i][cin>>a,a]=true; map[i][cin>>a,a]=true; map[i][

HDU 2181 哈密顿绕行世界问题

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

HDU 哈密顿绕行世界问题 (dfs)

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

HDOJ 题目2181 哈密顿绕行世界问题(DFS)

哈密顿绕行世界问题 Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 1517    Accepted Submission(s): 967 Problem Description 一个规则的实心十二面体,它的 20个顶点标出世界著名的20个城市,你从一个城市出发经过每个城市刚好一次后回到出发的城市. Input 前20行的第i行有3个数

DFS HDOJ 2181 哈密顿绕行世界问题

题目传送门 题意:中文题面 分析:直接排完序后DFS.这样的题以后不应该再写题解的. #include <bits/stdc++.h> using namespace std; vector<int> G[21]; int ans[21]; int v[3]; bool vis[21]; int cnt; void print() { printf ("%d: ", ++cnt); for (int i=0; i<20; ++i) { printf (&q

哈密顿绕行世界问题(dfs+记录路径)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2181 哈密顿绕行世界问题 Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 2362    Accepted Submission(s): 1490 Problem Description 一个规则的实心十二面体,它的 20个顶点标出世界著名的

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

题目传送门 C - 哈密顿绕行世界问题 一个规则的实心十二面体,它的 20个顶点标出世界著名的20个城市,你从一个城市出发经过每个城市刚好一次后回到出发的城市. Input 前20行的第i行有3个数,表示与第i个城市相邻的3个城市.第20行以后每行有1个数m,m<=20,m>=1.m=0退出. Output 输出从第m个城市出发经过每个城市1次又回到m的所有路线,如有多条路线,按字典序输出,每行1条路线.每行首先输出是第几条路线.然后个一个: 后列出经过的城市.参看Sample output

哈密顿绕行世界问题

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