用界限剪枝法求出从南昌出发,经过10个城市,(仅经历一次),然后回到南昌的最短路程,并输出路径。
1条回答 默认 最新
答主 2023-02-19 10:45关注#include <iostream> #include <vector> #include <algorithm> using namespace std; const int N = 11; const int inf = 0x3f3f3f3f; int dist[N][N]; // 存储城市之间的距离矩阵 int ans = inf; // 存储最短路径长度 vector<int> path; // 存储最短路径 void dfs(int cur, int step, vector<int> &vis, int dis) { if (step == 11 && cur == 0) // 已经经过10个城市并回到南昌 { ans = min(ans, dis); // 更新最短路径长度 path.push_back(0); return; } if (dis + dist[cur][0] + (10 - step + 1) * 50 >= ans) // 界限函数,剪枝 return; for (int i = 1; i < N; i++) { if (vis[i] || dist[cur][i] == inf) continue; // 访问过或者不连通 vis[i] = 1; path.push_back(i); dfs(i, step + 1, vis, dis + dist[cur][i]); path.pop_back(); vis[i] = 0; } } int main() { // 读入城市之间的距离矩阵 for (int i = 0; i < N; i++) { for (int j = 0; j < N; j++) { if (i == j) dist[i][j] = 0; else dist[i][j] = inf; } } // 将城市之间的距离存入dist数组 // ... vector<int> vis(N, 0); // 标记数组,标记城市是否已经经过 vis[0] = 1; // 从南昌出发 path.push_back(0); // 加入南昌到路径中 dfs(0, 1, vis, 0); // 深度优先搜索 // 输出最短路径 cout << "最短路径长度为:" << ans << endl; cout << "最短路径为:"; for (int i = 0; i < path.size(); i++) cout << path[i] << " "; cout << endl; return 0; }解决 无用评论 打赏 举报