问题描述
旅行售货员问题
某售货员要到若干城市去推销商品,已知各城市之间的路程(或旅费)。他要选定一条从驻地出发,经过每个城市一次,最后回到驻地的路线,使总的路程(或总旅费)最小。
解决方法
就是建立旅行树,把所有城市足迹列出来
#include<bits/stdc++.h>
using namespace std;
int a[1234][1234];//城市间距离
int x[1234];//记录路径
int bestx[1234];//记录最佳路径
int bestcp=1234567;//最佳距离
int cp=0;//当前路径
int n;
void backpack(int t)
{
if(t>n)
{
if(a[x[n]][1]&&(a[x[n]][1]+cp)<bestcp)
{
bestcp=a[x[n]][1]+cp;
for(int i=1;i<=n;i++)
bestx[i]=x[i];
}
}
else
{
for(int i=t;i<=n;i++)
{
if(a[x[t-1]][x[i]]&&(cp+a[t-1][x[i]])<bestcp)
{
swap(x[t],x[i]);
cp+=a[x[t-1]][x[t]];
backpack(t+1);
cp-=a[x[t-1]][x[t]];
swap(x[t],x[i]);
}
}
}
}
int main()
{
cout<<"请输入城市个数:";
cin>>n;
cout<<"请输入城市间的距离(0为城市间不通):"<<endl;
for(int i=1;i<=n;i++)
for(int j=i;j<=n;j++)
{
cin>>a[i][j];
a[j][i]=a[i][j];
}
for(int i=1;i<=n;i++)
x[i]=i;
backpack(2);
cout<<"最佳路径长度为:";
cout<<bestcp<<endl;
for(int i=1;i<=n;i++)
{
if(i==1) cout<<bestx[i];
else cout<<"-->"<<bestx[i];
}
cout<<endl;
return 0;
}