Ranking (as of 2014-07-01): 45 out of 272
Language: C++
/* UVa 775 - Hamiltonian Cycle To build using Visual Studio 2012: cl -EHsc -O2 UVa_775_Hamiltonian_Cycle.cpp */ #include <vector> #include <cstdio> using namespace std; const int n_max = 256; vector<int> edges[n_max + 1]; bool visited[n_max + 1]; int path[n_max + 1]; bool hamiltonian_cycle(int n, int ni, int vi) { if (ni == n) { const vector<int>& e = edges[path[ni - 1]]; for (size_t i = 0; i < e.size(); i++) if (e[i] == 1) { path[ni] = 1; return true; } return false; } else { const vector<int>& e = edges[vi]; for (size_t i = 0; i < e.size(); i++) if (!visited[e[i]]) { path[ni] = e[i]; visited[e[i]] = true; if (hamiltonian_cycle(n, ni + 1, e[i])) return true; visited[e[i]] = false; } return false; } } int main() { int n; while (scanf("%d", &n) != EOF) { getchar(); for (int i = 1; i <= n; i++) { edges[i].clear(); visited[i] = false; } char c; while ((c = getchar()) != '%') { ungetc(c, stdin); int u, v; scanf("%d %d", &u, &v); edges[u].push_back(v); edges[v].push_back(u); getchar(); } path[0] = 1; visited[1] = true; if (hamiltonian_cycle(n, 1, 1)) { for (int i = 0; i <= n; i++) printf("%d%c", path[i], ((i < n) ? ' ' : '\n')); } else puts("N"); } return 0; }
No comments:
Post a Comment