不赘述题目了。思路是回溯法,具体如下:
假设城市=4,出发地=1城市,那么所有可能如下:
1->2->3->4->1
1->2->4->3->1
1->3->2->4->1
1->3->4->2->1
1->4->3->2->1
1->4->2->3->1
可见,本质是对中间三个城市全排列。剪枝方案如下:
先初始化一个最低成本。回溯时计算每一步的成本,如果当前成本比最低成本高,则剪枝。否则,更新最低成本,保存当前路线。
代码如下:
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <limits.h>
#include <assert.h>
#include <vector>
#include <iomanip>
using namespace std;
//旅行者售货员问题
class Question
{
public:
Question()
{
cout << "请输入城市数量:";
cin >> number;
assert(number > 1);
weight.resize(number+1);
for (size_t i = 0; i < weight.size(); ++i)
weight[i].resize(number+1, 0);
cout << "请输入各边长" << endl;
int from, to, height