回溯法,回溯法有“通用的解题法”之称。用它可以系统地搜索一个问题的所有解或任一解。回溯法是一种即带有系统性又带有跳跃性的搜索算法。它在问题的解空间树中,按深度优先策略,从根节点出发搜索解空间树。算法搜索至解空间树的任一结点时,先判断该节点是否包含问题的解。如果不包含,则跳过对以该节点为根的子树的搜索,逐层向其它祖先节点回溯。否则,进入该子树,继续按照深度优先策略搜索。回溯法求问题的所有解时,要回溯到根,且根节点的所有子树都已被搜索遍才结束。
void f2(int step ,int now)//step代表从顶点1出发到达的第step个点,now代表现在遍历到的顶点编号
{
// 输出条件:
// 1、找到一条哈密顿通路
// 2、验证该哈密顿通路的最后一个顶点是否与顶点1直接连接,即验证是否为哈密顿回路
if( step==N && E[now][1] )
{
tot2++;
// printf("1");
// for(int i=1;i<=N-1;i++)
// {
// printf("--%d",arr[i]);
// }
// printf("--1是一条哈密顿回路。\n");
}
for(int i=2;i<=N;i++)
{
if( E[now][i] && (!book[i]) )
{
book[i]=1; //先让他标记为1表示用过了
arr[step]=i; //放到盒子里去
f2(step+1,i); //继续搜索下一个地方
book[i]=0; //消除之前的标记
}
}
}
本文深入探讨了回溯法,一种用于寻找问题所有解或任意解的系统性搜索算法。通过深度优先策略,从解空间树的根节点开始,回溯法在不包含问题解的节点上进行跳跃式搜索。当找到哈密顿通路或回路时,算法会进行特定的输出。代码示例展示了如何在图中应用回溯法寻找哈密顿回路。
3054

被折叠的 条评论
为什么被折叠?



