刷题(最优升级路径)

在这里插入图片描述
思路:深度优先遍历
将所有路径及路径值放入数组,比较路径值选择最小的

var line1=readline().split(" ");
var l=line1[0],r=line1[1];
var arr=[];
while(line2=readline().split(" ")){
	arr.push(line2);
}
var len=0;
var m=[l];
var res=[];
function minLen(arr,m,len){
	for(var i=0;i<arr.length;i++){
		if(arr[i][0]==m[m.length-1]){
			 minLen(arr,m.concat(arr[i][1]),len+arr[i][2]);
		}
	}
	//将路径放入数组
	if(m[m.length-1]==r){
		m.push(len);
		res.push(m);
	}
}
minLen(arr,m,len);
//选取路径升级大小最小的
var newArr=res.shift();
var min=newArr.pop();
while(res.length){
	m=res.pop();
	n=m.pop();
	if(n<min){
		min=n;
		newArr=m;
	}
}
print(newArr.join("->")+"("+min+")");

我室友的方法:
思路:贪心算法,每次选择当前起点的所有路径里面,单位路径价值最高者作为下一步要走的路径

vector<int>roate;
int sum=0, temp=0, val=0;
while(s_e[0]!=s_e[1]){
	temp=0, val=0;
	roate.push_back(s_e[0]);
	for(auto i=0; i<map.bucket_count(); i++){
		if(map.cbegin(i)->first!=s_e[0]){
			continue;
		}
		//查找哈希表中每个篮子里面起点相同的路径中,平均路径最赚的作为最终结果
		for(auto local_it=map.cbegin(i); local_it!=map.cend(i); ++local_it){
			if(val<local_it->second.price){
				val=local_it->second.price;
				sum+=local_it->second.val;
				s_e[0]=local_it->second.end;
			}
		}
		roate.push_back(s_e[0]);
		}
	}
	for(int i=0; i<roate.size()-1; i++){
		cout<<roate[i]<<"->";
	}
	cout<<roate.back()<<"("<<sum<<")"<<endl;
}

int main(){
	vector<int>s_e={1000,1050};
	vector<node>vec;

	node no;
	int n=6;
	while(n-- && cin>>no.start>>no.end>>no.val){
		vec.push_back(no);
	}
	helper(s_e, vec);
	return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_41805715/article/details/89308882