描述:已知n个城市之间的相互距离,现在有一个推销员必须遍访这n个城市,并且每个城市只能访问一次,最后必须再回到出发城市。如何安排这些城市的访问次序,使得旅行路线的总长度最短?
思路:贪心思想,从出发城市开始,每一次都找所有没有被访问过的城市中,找距离当前这个城市最近的城市进行访问。一直到最后所有城市都访问结束,再加上最后访问的那个城市到起点的距离。
参考了一篇博文,说是由于该问题的可行解是所有顶点的全排列,随着顶点数的增加,会产生组合爆炸。所以可以用贪心算法来解决这个问题,当数据规模越大时,以近似解来替代最优解。参考链接(https://blog.csdn.net/fancynece/article/details/79455821)
#include<bits/stdc++.h>
using namespace std;
#define n 4
#define MAX 1000000
int D[n][n]; //记录两城市间距离
int S[n]; //记录第i次去的城市
int sum;
void init() {
for(int i=0; i<n; i++) {
for(int j=i; j<n; j++) {
D[i][j]=MAX;
D[j][j]=MAX;
}
}
for(int i=0; i<n; i++) {
S[i]=-1;
}
}
int check(int x) {
for(int i=0;