大家好,我是一只学弱狗,记录学习的点点滴滴!
优质文章
优质专栏
题目描述
有n个城市,已知任两个城市之间的距离,求一条每个城市恰好经过1次的回路,使得总长度最小
#include <iostream>
using namespace std;
//城市的个数
int n;
//得到任意两点之间的距离
int getDistance(int **distances,int x,int y){
if(x==y) return 0;
if(x<1 || x>n || y<1 || y>n) return -1;
return distances[min(x,y)-1][max(x,y)-min(x,y)-1];
}
//初始化距离是最大值
int result = 1e6;
//深度搜索
void dfs(int **distances,int *recode,int *trace,int pos,int *min_trace){
if(pos==n){
//对当前方案求解
int sum = 0;
for(int i=0;i<n-1;i++){
sum+=getDistance(distances,trace[i],trace[i+1]);
}
sum+=getDistance(distances,trace[0],trace[n-1]);
if(sum< result)//若比当前的解优,则替换
{
result = sum;
for(int i=0;i<n;i++)
min_trace[i] = trace[i];
}
}
for(int i=0;i<n;i++){
//深度搜索
if(recode[i]==0){
recode[i]=1;
trace[pos]=i+1;
dfs(distances,recode,trace,pos+1,min_trace);
recode[i]=0;//回溯
}
}
}
int main(){
freopen("货郎问题.txt","r",stdin);
//初始化各个城市之间的距离
cin>>n;
int **distances = new int*[n-1];
for(int i=0;i<n-1;i++)
distances[i] = new int[n-1-i];
for(int i=0;i<n-1;i++){
for(int j=0;j<n-1-i;j++){
cin>>distances[i][j];
}
}
//用于标记
int *recode = new int[n];
for(int i=0;i<n;i++) recode[i]=0;
//用于记录当前方案
int *trace = new int[n];
//最优方案解
int *min_trace = new int[n];
dfs(distances,recode,trace,0,min_trace);
cout<<result<<endl;
//打印方案
for(int i=0;i<n;i++){
cout<<min_trace[i]<<" ";
}
cout<<endl;
delete[] distances;
distances = NULL;
return 0;
}