首页 > 其他分享 >PAT A1030 Travel Plan

PAT A1030 Travel Plan

时间:2023-06-09 14:32:30浏览次数:32  
标签:PAT temp nnode int Travel len cost Plan path


PAT A1030 Travel Plan 

dijkstra  优先队列实现  +  dfs 

#include<iostream>
#include<queue>
#include<vector>
#include<cstdio>
#include<cstring>
using namespace std;
const int MAXN = 10000;
const int INF = 0x3f3f3f3f;


struct node{
	int to,len,cost,rec;
	node(){}
	node(int to,int len,int cost,int rec):to(to),len(len),cost(cost),rec(rec){}
};

struct qnode{
	int id,len;
	qnode(){};
	qnode(int id,int len):id(id),len(len){};
	bool operator < (const qnode & b) const{
		return len > b.len;
	}
	
};

vector<node> map_[MAXN];
void add_edge(int a,int b,int len ,int cost){
	map_[a].push_back(node(b,len,cost,map_[b].size()));
	map_[b].push_back(node(a,len,cost,map_[a].size()-1));
}

int N,M,start,end; 

int dist[MAXN];

vector<int> pre[MAXN];
void dijkstra(int start){
	
	fill(dist,dist+N,INF);
	dist[start] = 0;
	priority_queue<qnode> que;
	que.push(qnode(start,0));
	
	while(!que.empty()){
		qnode temp = que.top(); que.pop();
		for(int i=0;i<map_[temp.id].size();i++){
			node nnode = map_[temp.id][i];
			if(dist[nnode.to]> dist[temp.id] + nnode.len){
				dist[nnode.to] =  dist[temp.id] + nnode.len;
				que.push(qnode(nnode.to,dist[nnode.to]));
				pre[nnode.to].clear();
				pre[nnode.to].push_back(temp.id);
			}else if(dist[nnode.to] == dist[temp.id] + nnode.len){
				pre[nnode.to].push_back(temp.id);
			}
		}
	}	
}

int cal(vector<int> path){
	int ans =0;
	for(int i=path.size() - 1;i>=1;i--){
		for(int j=0;j<map_[path[i]].size();j++){
			if(map_[path[i]][j].to == path[i-1]){
				ans += map_[path[i]][j].cost;
				break;	
			}
		} 
	}
	return ans;
}

void output(vector<int> path){

	printf("-------------\n");
	for(int i=path.size() - 1;i>=0;i--){
		printf("%d ",path[i]);
	}
}



int min_cost = INF;
vector<int> main_path;
vector<int> temp_path;

void dfs_out(int start,int end){
	
	if(start == end){
		temp_path.push_back(start);
		int temp_cost = cal(temp_path);
//		output(temp_path);
//		printf("%d \n",temp_cost);
		if(temp_cost < min_cost){
			main_path = temp_path;
			min_cost = temp_cost;
		}
		temp_path.pop_back();
		return;
	}
	
	temp_path.push_back(end);
	for(int i=0;i<pre[end].size();i++){
		dfs_out(start,pre[end][i]);
	}
	temp_path.pop_back();
}




int main(){
	
	scanf("%d%d%d%d",&N,&M,&start,&end);
	for(int i=0;i<M;i++){
		int a,b,len,cost;
		scanf("%d%d%d%d",&a,&b,&len,&cost);
		add_edge(a,b,len,cost);
	}
//	for(int i=0;i<N;i++){
//		for(int j=0;j<map_[i].size();j++){
//			printf("%d ",map_[i][j].to);
//		}
//		printf("\n");
//	}
		
	
	dijkstra(start);
	dfs_out(start,end);
	
	for(int i=main_path.size() - 1;i>=0;i--){
		printf("%d ",main_path[i]);
	}
	printf("%d %d",main_path.size(),min_cost);
	
	return 0;
}

 

标签:PAT,temp,nnode,int,Travel,len,cost,Plan,path
From: https://blog.51cto.com/u_11384719/6447749

相关文章

  • 14) chain of responsibility pattern
    类别: behavioralpattern问题: 高耦合,不灵活if(){}elseif(){}elseif(){}... 方案:    示例: publicclassChainOfResponsibilityPattern{publicstaticvoidmain(String[]args){//灵活装配Pipelinenode1=newNod......
  • 13) Proxy Pattern
    类别: StructuralPattern问题:操纵一个对象时碍手碍脚,与装饰者模式不同之处:装饰者是接口方法,授权小代理则是整个类,授权大方案:   示例: publicclassProxyPatternDemo{publicstaticvoidmain(finalString[]arguments){finalImageimage......
  • 12) Flyweight Pattern
    类别: StructuralPattern问题/动机: 假若绿色是相同部分,占用1M内存,如果提取出来,众对象共享其内容,只占1M内存,否则占10M,且随着对象增多,占用越来越多内存,无疑是浪费资源Aflyweightisanobjectthatminimizesmemoryusagebysharingasmuchdataaspossiblewithot......
  • 11) Facade Pattern
    类别: StructuralPattern问题/动机:系统非常复杂隐藏复杂细节,提供简单界面方案:  示例: /*Complexparts*/publicclassFacadePatternDemo{publicstaticvoidmain(String[]args){CarFacadefacade=newCarFacade();facade.CreateC......
  • document.evaluate的详细用法(Xpath获取节点)
    document.evaluate的详细用法2006-12-2818:03使用 Greasemonkey 时会遇到的功能最为强大的一个工具就是 evaluate 函数。通过使用XPath这种查询语言,它可以用来寻找页面中的元素,属性和文本。 举个例子来说,如果您想获得某个页面上的全部链接。您也许会想到使用document.getEle......
  • XPath 简单语法
    XPath是XML的查询语言,和SQL的角色很类似。以下面XML为例,介绍XPath的语法。<?xmlversion="1.0"encoding="ISO-8859-1"?><catalog><cdcountry="USA"><title>EmpireBurlesque</title><artist>BobDylan</arti......
  • if [ "$1""xx" != "xx" ];then current_path=$1 fi汉语
     if["$1""xx"!="xx"];thencurrent_path=$1fi这段sh脚本代码是用来检查当前工作目录的。它的作用是,如果用户传递了一个参数(比如"xx"),而且该参数与当前工作目录不同,则将当前工作目录设置为传递的参数(即"xx")。具体来说,代码中的"if"语句判断参数$1是否等......
  • @Param、@PathVariable 和 @RequestParam的使用场景和区别
    @Param、@PathVariable和@RequestParam的使用场景和区别@Param注解:使用框架:MyBatis(持久层框架),一般只在xxxmapper.java上使用,当传输的数据超过一个时,需要使用它来取别名,否则数据库无法区分用途:指定方法参数与SQL查询参数的对应关系。场景:在MyBatis中,@Param注解用......
  • Selenium+xpath爬取简书
    fromseleniumimportwebdriverimporttimefromlxmlimportetreeimportpymysqldriver=webdriver.Chrome()driver.get('https://www.jianshu.com/')#加载更多defload_mord(num):#通过观察发现,打开页面需要鼠标滑动大概5次左右才能出现阅读更多按钮for......
  • 解决使用yarn安装依赖出现“The engine "node" is incompatible with this module. Ex
    1、问题描述某天在使用yarn安装依赖的时候,突然出现如下错误导致安装依赖终止:Theengine"node"isincompatiblewiththismodule.Expectedversion"^14.18.0||^16.14.0||>=18.0.0".Got"17.9.0"2、解决办法使用如下命令忽略错误:yarnconfigsetignore-enginestr......