图形不完整

Incomplete graph

本文关键字:图形      更新时间:2023-10-16

我有一个图的邻接矩阵。我想计算哈密顿路径的数目。我知道蛮力方法测试所有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 -> %dn", parent[i], i);
    return 0;
}

这个用于计算所有Hamilton路径的数量:

#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("%lldn", find_hamilton_path_number());
    return 0;
}

这是正在进行的比赛中出现的问题https://www.codechef.com/JAN16/problems/SEAKAM