我遇到了一个小问题。我有一个程序可以找到哈密顿循环,但是只有一个程序(找到循环后停止)。
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;
}
如何更改程序,使其显示所有可能的汉密尔顿周期?我知道我必须在第一次找到它并添加某种停止条件后就不必停止,但是我很难确定这一点。
答案 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
现在不会说该解决方案不存在。现在由您决定如何还原此功能。