货郎问题

大家好,我是一只学弱狗,记录学习的点点滴滴!

优质文章

优质专栏


题目描述
  有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;
} 
 

猜你喜欢

转载自blog.csdn.net/qq_44486437/article/details/112643812