哈密顿绕行世界问题---hdu2181(全排列问题)

Posted 西瓜不懂柠檬的酸

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了哈密顿绕行世界问题---hdu2181(全排列问题)相关的知识,希望对你有一定的参考价值。

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2181

 题意很容易理解,dfs就可以了

 

技术分享
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <algorithm>
#include <stdlib.h>
#include <queue>
#include <map>
#include <vector>

using namespace std;

typedef long long LL;

#define met(a, b) memset(a, b, sizeof(a))
#define INF 0x3f3f3f3f
#define N 25

int G[N][N], A[N], vis[N], t;

void dfs(int s, int k)
{
    if(k == 21)
    {
        if( G[A[20]][A[1]] )
        {
            A[21] = A[1];

            printf("%d: ", t++);

            for(int i=1; i<=21; i++)
                printf(" %d", A[i]);

            printf("\n");
        }
        return;
    }
    for(int i=1; i<=20; i++)
    {
        if( G[s][i] && !vis[i])
        {
            A[k] = i;
            
            vis[i] = 1;
            
            dfs(i, k+1);
            
            vis[i] = 0;
        }
    }
}

int main()
{
    int a, b, c, m;

    met(G, 0);

    for(int i=1; i<=20; i++)
    {
        scanf("%d %d %d", &a, &b, &c);

        G[i][a] = G[i][b] = G[i][c] = 1;
    }

    while(scanf("%d", &m), m)
    {
        t = 1;

        met(vis, 0);

        met(A, 0);

        A[1] = m;

        vis[m] = 1;

        dfs(m, 2);
    }
    return 0;
}
View Code

 

以上是关于哈密顿绕行世界问题---hdu2181(全排列问题)的主要内容,如果未能解决你的问题,请参考以下文章

HDU 2181 哈密顿绕行世界问题

哈密顿绕行世界问题 HDU2181

HDU - 2181 C - 哈密顿绕行世界问题(DFS

HDU - 2181-哈密顿绕行世界问题

HDU - 2181 哈密顿绕行世界问题

HDU - 2181 哈密顿绕行世界问题