DFS 专题 哈密顿绕行世界问题
注意:标号后面是两个空格。
# include <cstdio> # include <cstring> # include <algorithm> using namespace std; int n, m, adj[21][3]; bool vis[21]; int solu[22]; void dfs(int cur, int cnt) { int t; for (int i = 0; i < 3; ++i) { t = adj[cur][i]; if (cnt == 20 && t == m) { printf("%d: %d", ++n, m); for (int i = 2; i <= 21; ++i) printf(" %d", solu[i]); putchar('\n'); return ; } else if (vis[t] == false) { vis[t] = true; solu[cnt+1] = t, dfs(t, cnt+1); vis[t] = false; } } } void init(void) { int x, y ,z; for (int i = 1; i < 21; ++i) { scanf("%d%d%d", &x, &y, &z); adj[i][0] = min(x, min(y, z)); adj[i][2] = max(x, max(y, z)); adj[i][1] = x+y+z - adj[i][0] - adj[i][2]; } } void solve(void) { while (scanf("%d", &m), m) { memset(vis, false, sizeof(vis)); n = 0, solu[1] = solu[21] = m; vis[m] = true; dfs(m, 1); vis[m] = false; } } int main() { init(); solve(); return 0; }
/**/