
Contents
Problem
題目網址
哈密頓迴圈問題,給你每個邊(無向圖),請求出一條路徑剛好走過各個點 一次 ,最後回到起點。
Solution
其實從哪開始走沒差,畢竟會繞成一個迴圈。
Code
UVa 775UVa 775 - Hamiltonian Cycle
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76
|
#include<stack> #include<vector> #define N 1000 using namespace std;
vector<int> v[N]; int path[N]; bool isVisit[N]; bool (int n, int count); int main() {
int n, i, j;
while (scanf("%d", &n) != EOF) { for (i = 0; i <= n; i++) { isVisit[i] = false; v[i].clear(); }
while (scanf("%d%d", &i, &j) == 2) { v[i].push_back(j); v[j].push_back(i); } getchar();
path[0] = 1; isVisit[1] = true; if (!backtracking(n, 1)) puts("N"); }
return 0; } bool (int n, int count) { static int first; int i, j;
if (count == n) { int size = v[path[n - 1]].size(); for (i = 0; i < size; i++) if (v[path[n - 1]][i] == path[0]) { for (int j = 0; j < n; j++) printf("%d ", path[j]); printf("%dn", path[0]); return true; }
return false; }
int size = v[path[count - 1]].size(); for (i = 0; i < size; i++) { int next = v[path[count - 1]][i]; if (!isVisit[next]) { isVisit[next] = true;
path[count] = next; if (backtracking(n, count + 1)) return true;
isVisit[next] = false; } }
return false; }
|
近期评论