(HDU2181) 哈密頓繞行世界問題-DFS
阿新 • • 發佈:2018-12-13
哈密頓繞行世界問題
Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 7428 Accepted Submission(s): 4408
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
略
題目大意:就是從目的地出發每個地方經過一次,最後回到出發點,問所有的線路,線路按字典序排序。
分析:這道題比較水,搜尋樹是三叉樹,對每個點去對和當前點相連的三個點dfs就可以了。用visit陣列做標記。
程式碼:
#include<iostream> using namespace std; struct Node { int a, b, c; }; Node q[21]; int m; int path[22]; int acnt = 0; int visit[22]; void print() { cout << acnt << ": "; for (int i = 1; i <= 20; i++) cout << " "<<path[i]; cout << " " << m << endl; } void DFS(int t,int ccnt) { if (ccnt == 21) { if (t == m) { acnt++; print(); return; } } if (visit[t])return; visit[t] = 1; path[ccnt] = t; DFS(q[t].a,ccnt+1); DFS(q[t].b,ccnt+1); DFS(q[t].c,ccnt+1); visit[t] = 0; } int main() { int a, b, c; for (int i = 1; i <= 20; i++) { cin >> a >> b >> c; q[i].a = a; q[i].b = b; q[i].c = c; } while (cin >> m&&m) { acnt = 0; memset(visit, 0, sizeof(visit)); DFS(m,1); } return 0; }