旅行商问题
问题描述
某售货员要到若干城市去推销商品,已知各城市之间的路程(旅费),他要选定一条从驻地出发,经过每个城市一遍,最后回到驻地的路线,使总的路程(总旅费)最小。
// Traveling.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//
#include <iostream>
using namespace std;
template<class Type>
class Traveling
{
friend void TSP(int**);
private:
void Backtrack(int);
int n,//图的顶点数
* x;//当前解
Type** a,//二维数组
cc,//当前费用
bestc,//最好费用
NoEdge;
};
void TSP(int** a)
{
Traveling<int> traveling;
traveling.a = a;
traveling.bestc = -1;
traveling.cc = 0;
traveling.n = 4;
traveling.NoEdge = -1;
traveling.x = new int[4 + 1];
for (int i = 1; i <= 4;i++)
traveling.x[i] = i;
traveling.Backtrack(2);
}
void Swap(int& a, int& b)
{
int temp = a;
a = b;
b = temp;
}
template<class Type>
void Traveling<Type>::Backtrack(int t)
{
if (t == n)
{
if (a[x[n - 1]][x[n]] != NoEdge && a[x[n - 1]][1] != NoEdge &&
(cc + a[x[n - 1]][x[n]] + a[x[n - 1]][1] < bestc || bestc == NoEdge))
{
for (int i = 1; i <= n; i++)
cout << x[i] << "\t";
cout << endl;
bestc = cc + a[x[n - 1]][x[n]] + a[x[n - 1]][1];
cout << bestc << endl;
}
}
else
{
for (int i = t; i <= n; i++)
{
if (a[x[t - 1]][x[i]] != NoEdge && (cc + a[x[t - 1]][x[i]] < bestc || bestc == NoEdge))
{
Swap(x[t], x[i]);
cc += a[x[t - 1]][x[i]];
Backtrack(t + 1);
cc -= a[x[t - 1]][x[i]];
Swap(x[t], x[i]);
}
}
}
}
int main()
{
int** A;
A= new int*[5];
for (int i = 0; i < 5; i++)
A[i] = new int[5];
A[0][0] = -1, A[0][1] = -1, A[0][2] = -1, A[0][3] = -1, A[0][4] = -1;
A[1][0] = -1, A[1][1] = -1, A[1][2] = 30, A[1][3] = 6, A[1][4] = 4;
A[2][0] = -1, A[2][1] = 30, A[2][2] = -1, A[2][3] = 5, A[2][4] = 10;
A[3][0] = -1, A[3][1] = 6, A[3][2] = 5, A[3][3] = -1, A[3][4] = 20;
A[4][0] = -1, A[4][1] = 4, A[4][2] = 10, A[4][3] = 20, A[4][4] = -1;
TSP(A);
return 0;
}