哈密頓繞行世界問題 HDU - 2181

 

題目連接:https://vjudge.net/problem/HDU-2181

題意:一個規則的實心十二面體,它的 20個頂點標出世界著名的20個城市,你從一個城市出發通過每一個城市恰好一次後回到出發的城市。 node

思路:dfs和回溯,算一個基礎題吧,這裏須要鄰接矩陣,用bool就能夠,也能夠用vector,數據小,就用前者了ios

 1 #include <iostream>
 2 #include <algorithm>
 3 #include <cstring>
 4 #include <queue>
 5 #include <vector>
 6 #include <string>
 7 
 8 using namespace std;
 9 
10 #define inf (1LL << 31) - 1
11 #define rep(i,j,k) for(int i = j; i <= (k); i++)
12 #define rep__(i,j,k) for(int i = j; i < (k); i++)
13 #define per___(i,j,k) for(int i = j; i > (k); i--)
14 #define per(i,j,k) for(int i = j; i >= (k); i--)
15 
16 const int N = 30;
17 bool mp[N][N]; //鄰接矩陣
18 int in;
19 bool vis[N]; //記錄拜訪過的城市,每一個dfs的分支都須要一次初始化
20 int ans; 
21 
22 struct node{
23     int way[N]; //記錄路線
24     int l; //長度
25     node(int a = 0){ l = a; }
26 };
27 
28 void input(){
29 
30     memset(mp, false, sizeof(mp));
31     int a, b, c;
32     rep(i, 1, 20){
33         cin >> a >> b >> c;
34         mp[i][a] = mp[i][b] = mp[i][c] = true;  //能到達的爲true
35     }  
36 }
37 
38 void dfs(int now,node& rec){
39     
40     //拜訪了全部的城市
41     if (rec.l == 20){
42         
43         //拜訪的最後一個城市能不能回到初始城市
44         if (!mp[now][in]) return;
45         
46         //能夠,輸出答案
47         cout << (++ans) << ": ";
48         rep__(i, 0, rec.l) cout << " " << rec.way[i];
49         cout << " " << in << endl;
50         return;
51     }
52 
53     rep(i, 1, 20){
54         
55         //從小到大遍歷城市編號,解決了字典序
56         //能到,沒被拜訪過
57         if (mp[now][i] == true && !vis[i]){
58             vis[i] = true;
59             rec.way[rec.l++] = i;
60             dfs(i, rec);
61             vis[i] = false;//(1)
62             rec.l--;       //(2)   (1)(2) 回溯
63         }
64     }
65 }
66 
67 int main(){
68 
69     input();
70 
71     node rec;
72 
73     while (cin >> in && in != 0){
74 
75         rec.way[rec.l++] = in; //記錄開始的城市
76         vis[in] = true; //標記已經拜訪過的城市
77         ans = 0;
78 
79         dfs(in,rec);
80     
81         rec.l = 0; //(1)
82         vis[in] = false; //(2)      (1)(2)回溯
83     }
84 
85     return 0;
86 }

 

 

,直接看代碼吧,寫的比較詳細spa

相關文章
相關標籤/搜索