题目描述
某推销员要从城市 v1 出发,访问其它城市v2,v3,…,v6 各一次且仅一次,最后返回v1。D为各城市间的距离矩阵。
问:该推销员应如何选择路线,才能使总的行程最短?
/*
编辑者 : Lin_QC
*/
#include<stdio.h>
#include<stdlib.h>
#define NODE_NUMBER 6
int D[NODE_NUMBER][NODE_NUMBER] = //每个点之间距离的矩阵
{ 0,10,20,30,40,50,
12,0,18,30,25,21,
23,19,0,5,10,15,
34,32,4,0,8,16,
45,27,11,10,0,18,
56,22,16,20,12,0
};
int Path[6][6]; // 行表示走到第几步,列表是当前在哪一个点,它的值表示下一个走哪
int cost[6][6] = {
1000,1000,1000,1000,1000,1000,
1000,1000,1000,1000,1000,1000,
1000,1000,1000,1000,1000,1000,
1000,1000,1000,1000,1000,1000,
1000,1000,1000,1000,1000,1000,
1000,1000,1000,1000,1000,1000
}; // 记录Path每一个数据的当前最优值,先初始化一个很大的值
int TSP(int step,int node ,int S)
{
int min = 10000;
int tmp = 10000;
int next_node=1;
int min_node;
if (step == 6) {
return D[node][0];
}
for (int i = 1; i <=16 ; i *= 2) {
int t = S & i;
if (t == i) {
tmp = D[node][next_node] + TSP(step +1, next_node, S - i);
if (min > tmp)
{
min = tmp;
min_node = next_node;
}
}
next_node++;
}
if (min < cost[step][node]) {
Path[step][node] = min_node;
cost[step][node] = min;
}
return min;
}
int main()
{
int next_node;
int ShortestDistance;
ShortestDistance=TSP(1,0,31);
printf("The Shortest distance is:%d\n",ShortestDistance);
printf("The best Path is: 1 ");
next_node = 0;
for (int i = 1; i <= 5; i++) {
printf("%d ", Path[i][next_node]+1);
next_node = Path[i][next_node];
}
printf("1 \n");
system("pause");
}