C++ 不完全图

C++ 不完全图,c++,graph,brute-force,C++,Graph,Brute Force,我有一个图的邻接矩阵。我想计算哈密顿路径的数目。 我知道蛮力法可以测试所有N!排列。但是,我无法编写代码,我尝试了搜索,但找不到可能的方法。 我在寻找简单暴力方法的帮助 谢谢。查看我刚才的实现: 也可以检查一下,了解一下它是如何完成的 #include <stdio.h> #include <stdbool.h> #define NUM_VERTICES 4 bool graph[NUM_VERTICES][NUM_VERTICES] = { {0, 1, 0

我有一个图的邻接矩阵。我想计算哈密顿路径的数目。 我知道蛮力法可以测试所有N!排列。但是,我无法编写代码,我尝试了搜索,但找不到可能的方法。 我在寻找简单暴力方法的帮助


谢谢。

查看我刚才的实现:

也可以检查一下,了解一下它是如何完成的

#include <stdio.h>
#include <stdbool.h>

#define NUM_VERTICES 4

bool graph[NUM_VERTICES][NUM_VERTICES] = {
    {0, 1, 0, 1},
    {1, 0, 1, 1},
    {0, 1, 0, 0},
    {1, 1, 0, 0},
};
int parent[NUM_VERTICES];

bool fin_hp_r(int v, int n)
{
    // If all vertices are connected
    if (n == NUM_VERTICES)
        return true;

    // For all neighbours
    for (int i = 0; i < NUM_VERTICES; ++i)
        if (graph[v][i] && parent[i] == -1)
        {
            parent[i] = v;
            if (fin_hp_r(i, n + 1))
                return true;
            parent[i] = -1;
        }

    return false;
}

bool find_hamilton_path()
{
    memset(parent, -1, sizeof(int) * NUM_VERTICES);

    for (int i = 0; i < NUM_VERTICES; ++i)
    {
        parent[i] = i;
        if (fin_hp_r(i, 1))
            return true;
        parent[i] = -1;
    }
}

int main(void) {
    find_hamilton_path();
    for (int i = 0; i < NUM_VERTICES; ++i)
        printf ("%d -> %d\n", parent[i], i);
    return 0;
}
这个用来计算所有哈密顿路径的个数:

#include <stdio.h>
#include <stdbool.h>

#define NUM_VERTICES 4

bool graph[NUM_VERTICES][NUM_VERTICES] = {
    {0, 1, 0, 1},
    {1, 0, 1, 1},
    {0, 1, 0, 0},
    {1, 1, 0, 0},
};
int parent[NUM_VERTICES];

long long cnt_fin_hp_r(int v, int n)
{
    // If all vertices are connected
    if (n == NUM_VERTICES)
        return 1;

    // For all neighbours
    long long res = 0;
    for (int i = 0; i < NUM_VERTICES; ++i)
        if (graph[v][i] && parent[i] == -1)
        {
            parent[i] = v;
            res += cnt_fin_hp_r(i, n + 1);
            parent[i] = -1;
        }

    return res;
}

long long find_hamilton_path_number()
{
    memset(parent, -1, sizeof(int) * NUM_VERTICES);

    long long res = 0;
    for (int i = 0; i < NUM_VERTICES; ++i)
    {
        parent[i] = i;
        res += cnt_fin_hp_r(i, 1);
        parent[i] = -1;
    }

    return res;
}

int main(void) {
    printf("%lld\n", find_hamilton_path_number());
    return 0;
}

这是一个正在进行的比赛的问题

这真的很有帮助。然而,我是通过邻接矩阵输入图形的,所以我试图修改我的代码,使其接受父级和图形作为参数,但这样做会有很多问题。如果你认为这会有帮助的话,我会添加我的代码。如果你只是在计算不同Hamilton路径的数量,那么父路径可以是一个集合或布尔名称数组。或者,您可以向每个vertice添加布尔实例值。不需要多次使用同一个顶点。这很好,但将图形作为参数传递是一个问题。我正在向您的代码中添加修改。请看,如果a和b之间有一条边,那么图[a][b]=图[b][a]=真。您指定了0,这是错误的。我的输入是未连接的顶点。其余的都连接起来了。代码给了我一个编译错误。您在for循环中缺少i变量的声明。prog.cpp:4:57:错误:在“]”标记long long cnt_fin_hp_rint v,int x,int n,bool graph[][n],int parent[]之前在函数体外部使用参数^prog.cpp:4:58:错误:应在“,”标记长cnt\U fin\U hp\U rint v,int x,int n,布尔图[][n],int父项[]^prog.cpp:4:59:错误:应在“int”长cnt\U fin\U hp\U rint v,int x,int n,布尔图[][n],int parent[]这些是我得到的错误。当n是参数之一时,不能在参数声明中输入n。只需通过布尔**图