旅行商问题之回溯法
代码实现
#include<iostream>
#include<cstdlib>
#include<algorithm>
using namespace std;
const int INF=1e7;
int n;
int m;
int**matrix;
int*x;
int*bestx;
int cl;
int bestl;
void init(int n){
matrix=(int**)malloc(sizeof(int*)*n);
for(int i=0;i<n;i++)
matrix[i]=(int*)malloc(sizeof(int)*n);
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
matrix[i][j]=matrix[j][i]=INF;
}
}
bestl=INF;
cl=0;
x=(int*)malloc(sizeof(int)*n);
bestx=(int*)malloc(sizeof(int)*n);
for(int i=0;i<n;i++){
x[i]=i;
bestx[i]=-1;
}
}
void Traveling(int t){
if(t>=n){
if(matrix[x[n-1]][0]!=INF&&(cl+matrix[x[n-1]][0])<bestl){
for(int j=0;j<n;j++){
bestx[j]=x[j];
}
bestl+=cl+matrix[x[n-1]][0];
}
}else{
for(int j=t;j<n;j++){
if(matrix[x[t-1]][x[j]]!=INF&&(cl+matrix[x[t-1]][x[j]])<bestl){
swap(x[t],x[j]);
cl+=matrix[x[t-1]][x[t]];
Traveling(t+1);
cl-=matrix[x[t-1]][x[t]];
swap(x[t],x[j]);
}
}
}
}
int main(void){
cout<<"请输入节点的个数"<<endl;
cin>>n;
cout<<"请输入边的个数"<<endl;
cin>>m;
init(n);
cout<<"输入两个节点的距离"<<endl;
int v1,v2,w;
for(int i=0;i<m;i++){
cin>>v1>>v2>>w;
matrix[v1][v2]=matrix[v2][v1]=w;
}
Traveling(1);
for(int i=0;i<n;i++)free(matrix[i]);
free(matrix);
for(int i=0;i<n;i++){
cout<<bestx[i]<<"--";
}
cout<<"0";
free(x);
free(bestx);
return 0;
}
样例
请输入节点的个数
5
请输入边的个数
9
输入两个节点的距离
0 1 3
0 3 8
0 4 9
1 2 3
1 3 10
1 4 5
2 3 4
2 4 3
3 4 20
0--4--1--2--3--0