/*
货郎担问题:
四个顶点的货郎担问题。求从顶点1出发,
最后回到顶点1的最短路线。
v1 v2 v3 v4
v1 无穷 无穷 1 7
v2 8 无穷 5 1
v3 7 2 无穷 1
v4 2 5 3 无穷
算法分析:
因为是采用回溯法来做,肯定是递归,然后还需要现场清理。
要设置一个二维数组来标识矩阵内容,然后回溯还需要设计
一个二维标记数组来剪枝,设定一个目标变量,初始为无穷大,
后续如果有比目标变量值小的就更新。剪枝的条件就是如果走到当前节点的耗费值>=目标变量,就直接不再往下面走,
向上走。
深度优先 = 递归
递归基:如果到达叶子节点的上一个节点,那么就进行是否更新的判断
递归步:如果没有到达叶子节点,就进行剪枝操作,判断能否进入下一个节点,如果能,更新最优值
输入:
4
0 0 1 7
8 0 5 1
7 2 0 1
2 5 3 0
输出:
1 3 2 4 1
6
*/
/*
关键:
1 //递归基:如果已经遍历到叶子节点的上一层节点,i标识递归深度
if(i == g_n)
{
//判断累加和是否超过最大值,如果有0,应该排除;满足这个条件,才打印
if((g_iArr[pArr[i-1]][pArr[i]] != 0) && (g_iArr[pArr[g_n]][1] != 0) &&
(g_iCurResult + g_iArr[pArr[i-1]][pArr[i]] + g_iArr[pArr[g_n]][1] < g_iResult ))
{
g_iResult = g_iCurResult + g_iArr[pArr[i-1]][pArr[i]] + g_iArr[pArr[g_n]][1];
//用当前最优路径去更新最优路径,防止下一次没有
for(int k = 1 ; k <= g_n ; k++)
{
g_iBestPath[k] = pArr[k];
2 //递归步:判断能否进入子树,需要尝试每一个节点
else
算法设计与分析:第五章 回溯法 5.1TSP之货郎担问题
最新推荐文章于 2025-05-29 16:17:48 发布