在给定图中找到所有哈密顿周期

时间:2019-05-13 17:09:16

标签: c++

我遇到了一个小问题。我有一个程序可以找到哈密顿循环,但是只有一个程序(找到循环后停止)。

  void displayCycle()
    {
        for (int i = 0; i < size; i++)
            std::cout << path[i] << " ";
        std::cout << path[0] << std::endl;
    }
    bool isValid(int v, int k)
    {
        if (matrix [path[k-1]][v] == 0)
            return false;

        for (int i = 0; i < k; i++)
            if (path[i] == v)
                return false;
        return true;
    }
    bool cycleFound(int k)
    {
        if (k == size)
        {
            if (matrix[path[k-1]][path[0]])
                return true;
            else
                return false;
        }

        for (int v = 1; v < size; v++)
        {
            if (isValid(v,k))
            {
                path[k] = v;
                if (cycleFound (k+1))
                    return true;
                path[k] = -1;
            }
        }
        return false;
    }
    bool hamiltonianCycle()
    {
        for (int i = 0; i < size; i++)
            path[i] = -1;
        path[0] = 0;

        if (!cycleFound(1))
        {
            std::cout << "Solution does not exist"<< std::endl;
            return false;
        }

        displayCycle();
        return true;
    }

如何更改程序,使其显示所有可能的汉密尔顿周期?我知道我必须在第一次找到它并添加某种停止条件后就不必停止,但是我很难确定这一点。

1 个答案:

答案 0 :(得分:7)

在找到循环后,尝试立即使递归函数调用displayCycle()

由于不想在找到一个周期后立即返回,因此希望摆脱两个return true;语句。相关片段变成

if (matrix[path[k-1]][path[0]])
      displayCycle();
return;

path[k] = v;
cycleFound (k+1);
path[k] = -1;

该函数的返回值现在无用,因此您可以使其返回void

当然main现在不会说该解决方案不存在。现在由您决定如何还原此功能。