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;
}

/**/

原文地址:https://www.cnblogs.com/JMDWQ/p/2599387.html