回溯法解旅行售货员问题【C++】

1.题目要求

回溯法解旅行售货员问题

售货员从城市1出发,到其他3个城市售货,最后返回城市1,给定各城市间路费消耗,求总消耗最小的花费以及路径。

输出示例:

最少花费:19

1->4->2->3

2.完整代码

#include <iostream>
#include <vector>

using namespace std;

const int N = 4;  // 城市数量

int g[N][N] = {
    {0, 30, 6, 4},
    {30, 0, 5, 10},
    {6, 5, 0, 20},
    {4, 10, 20, 0}
};

int minCost = INT_MAX;  // 最少花费
vector<int> path;  // 最优路径

// 回溯函数
void dfs(int u, int cost, vector<int>& p) {
    // 如果已经走完了所有城市,则更新最少花费和最优路径
    if (p.size() == N) {
        if (cost < minCost) {
            minCost = cost;
            path = p;
        }
        return;
    }

    // 遍历所有的城市
    for (int v = 1; v < N; v++) {
        // 如果当前城市没有走过,则继续搜索
        if (find(p.begin(), p.end(), v) == p.end()) {
            // 如果能到达该城市,则添加到路径中
            if (g[u][v] > 0) {
                p.push_back(v);
                dfs(v, cost + g[u][v], p);
                p.pop_back();
            }
        }
    }
}

int main() {
   
    vector<int> p;
    p.push_back(0);  // 从城市1出发
    dfs(0, 0, p);  // 开始回溯

    cout << "最少花费:" << minCost << endl;  // 输出最少花费
    cout << "最优路径:";
    for (int i = 0; i < path.size(); i++) {
        
        if (i == path.size() - 1) {
            cout << path[i] + 1 << endl;
        }
        else {
            cout << path[i] + 1 << "-> ";
        }
    }
    cout <<endl;
    
    return 0;
}

 3.运行结果截图

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
以下是用伪代码实现回溯法旅行售货员问题的示例: ``` function TSP(graph): n = len(graph) visited = [False] * n path = [] minDist = float('inf') def backtrack(curr, dist): nonlocal visited, path, minDist # 如果当前路径长度已经大于等于当前最小长度,则可以直接返回 if dist >= minDist: return # 如果已经访问了所有节点,则更新最小路径长度和最短路径 if all(visited): minDist = dist path = path[:] # 遍历当前节点的所有邻居节点 for neighbor in range(n): # 如果邻居节点还没有访问过,则可以将其加入路径中 if not visited[neighbor]: visited[neighbor] = True path.append(neighbor) backtrack(neighbor, dist + graph[curr][neighbor]) path.pop() visited[neighbor] = False # 从第一个节点开始回溯 visited[0] = True path.append(0) backtrack(0, 0) return path, minDist ``` 其中,`graph` 是一个二维列表,表示完全的邻接矩阵。函数的返回值是一个元组,表示最短路径和最小路径长度。在回溯过程中,使用一个 `visited` 列表来记录每个节点是否已经访问过,使用一个 `path` 列表来记录当前路径。在每次回溯时,遍历当前节点的所有邻居节点,如果邻居节点还没有访问过,则可以将其加入路径中。如果已经访问了所有节点,则更新最小路径长度和最短路径。如果当前路径长度已经大于等于当前最小长度,则可以直接返回。最后,从第一个节点开始回溯,返回最短路径和最小路径长度。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值