1111 Online Map
题意:给定一个图,以及起点和终点,需要我们计算两条路径。第1条路径:距离最短路径,若不唯一,则选择用时最短的那一条;第2条路径:用时最少路径,若不唯一,选择经过结点数最少的那一条。
思路:两次Dijkstra即可。以往都是求一条路径,本题要求两条,没什么不同,只是代码量多了一些。编写代码前要心中有数,变量名怎么命名等等(变量名一多,命名真是件举棋不定的事。。)
第1条路径:第1标尺为距离,第2标尺为用时,在Dijkstra中完成更新。用pre[v]记录结点v的前驱,在Dijkstra之后用DFS把路径提取出来即可。
第2条路径:第1标尺为用时,第2标尺为整条路径所经过的结点数,也可以在Dijkstra中完成更新。其他操作都是一模一样的。
#include <cstdio> #include <vector> #include <algorithm> using namespace std; const int Inf=0x7fffffff; ; struct Node{ int v; int length,time; Node(int v_,int len_,int t_):v(v_),length(len_),time(t_){} }; int n,m,s,e;//结点个数,边数,起点,终点 vector<Node> Adj[N]; bool vis[N]; vector<int> pre[N]; //dis[v]记录起点s到结点v的最短距离(第1标尺),cost[v]记录起点s到结点v的最快时间(第2标尺) int dis[N]; int cost[N]; //time[v]记录起点s到结点v的最快时间(第1标尺),num[v]记录起点s到结点v的最少结点数(第2标尺) int time[N]; int num[N]; void Dijkstra_length(int s) { fill(vis,vis+N,false); fill(dis,dis+N,Inf); dis[s]=; fill(cost,cost+N,Inf); cost[s]=; ;i<n;i++){ ,min=Inf; ;v<n;v++){ if(!vis[v] && dis[v]<min){ min=dis[v]; u=v; } } ) return; vis[u]=true; for(auto node:Adj[u]){//u-v int v=node.v, len=node.length, time=node.time; if(!vis[v]){ if(dis[u]+len < dis[v]){ dis[v] = dis[u]+len; cost[v] = cost[u]+time; pre[v].clear(); pre[v].push_back(u); }else if(dis[u]+len == dis[v] && cost[u]+time < cost[v]){ cost[v] = cost[u]+time; pre[v].clear(); pre[v].push_back(u); } } } } } void Dijkstra_time(int s) { fill(vis,vis+N,false); fill(time,time+N,Inf); time[s]=; fill(num,num+N,Inf); num[s]=; ;i<n;i++){ ,min=Inf; ;v<n;v++){ if(!vis[v] && time[v]<min){ min=time[v]; u=v; } } ) return; vis[u]=true; for(auto node:Adj[u]){//u-v int v=node.v, len=node.length, t=node.time; if(!vis[v]){ if(time[u]+t < time[v]){ time[v] = time[u]+t; num[v]=num[u]+; pre[v].clear(); pre[v].push_back(u); } < num[v]){ num[v]=num[u]+; pre[v].clear(); pre[v].push_back(u); } } } } } //用于提取路径 void dfs(int v,vector<int>& path) { path.push_back(v); for(auto u:pre[v]) dfs(u,path); } int main() { //freopen("pat.txt","r",stdin); int v1,v2,one_way,len,t; scanf("%d%d",&n,&m); ;i<m;i++){ scanf("%d%d%d%d%d",&v1,&v2,&one_way,&len,&t); if(one_way){ Adj[v1].push_back(Node(v2,len,t)); }else{ Adj[v1].push_back(Node(v2,len,t)); Adj[v2].push_back(Node(v1,len,t)); } } scanf("%d%d",&s,&e); vector<int> path_len,path_time;//分别记录两条路径 Dijkstra_length(s); dfs(e,path_len); Dijkstra_time(s); dfs(e,path_time); if(path_len==path_time){ printf("Distance = %d; Time = %d:",dis[e],time[e]); ;i>=;i--){ printf(" %d",path_time[i]); ) printf(" ->"); else printf("\n"); } }else{ printf("Distance = %d:",dis[e]); ;i>=;i--){ printf(" %d",path_len[i]); ) printf(" ->"); else printf("\n"); } printf("Time = %d:",time[e]); ;i>=;i--){ printf(" %d",path_time[i]); ) printf(" ->"); else printf("\n"); } } ; }
1111 Online Map的更多相关文章
- 1111 Online Map (30 分)
1111. Online Map (30)Input our current position and a destination, an online map can recommend sever ...
- 1111 Online Map (30 分)
1111 Online Map (30 分) Input our current position and a destination, an online map can recommend sev ...
- PAT甲级1111. Online Map
PAT甲级1111. Online Map 题意: 输入我们当前的位置和目的地,一个在线地图可以推荐几条路径.现在你的工作是向你的用户推荐两条路径:一条是最短的,另一条是最快的.确保任何请求存在路径. ...
- PAT 1111 Online Map[Dijkstra][dfs]
1111 Online Map(30 分) Input our current position and a destination, an online map can recommend seve ...
- PAT甲级——1111 Online Map (单源最短路经的Dijkstra算法、priority_queue的使用)
本文章同步发布在CSDN:https://blog.csdn.net/weixin_44385565/article/details/90041078 1111 Online Map (30 分) ...
- PAT (Advanced Level) 1111. Online Map (30)
预处理出最短路再进行暴力dfs求答案会比较好.直接dfs效率太低. #include<cstdio> #include<cstring> #include<cmath&g ...
- 1111. Online Map (30)
Input our current position and a destination, an online map can recommend several paths. Now your jo ...
- 1111 Online Map (30)(30 分)
Input our current position and a destination, an online map can recommend several paths. Now your jo ...
- PAT 1111 Online Map
Input our current position and a destination, an online map can recommend several paths. Now your jo ...
- PAT Advanced 1111 Online Map (30) [Dijkstra算法 + DFS]
题目 Input our current position and a destination, an online map can recommend several paths. Now your ...
随机推荐
- angular指令(二)--内置指令
一.基础ng 属性指令: ng-href ng-src ng-disabled ng-checked ng-readonly ng-selected ng-class ng-styl ...
- 四十五 Python分布式爬虫打造搜索引擎Scrapy精讲—elasticsearch(搜索引擎)的bool组合查询
bool查询说明 filter:[],字段的过滤,不参与打分must:[],如果有多个查询,都必须满足[并且]should:[],如果有多个查询,满足一个或者多个都匹配[或者]must_not:[], ...
- AI实现五子棋机器人(一)
前言: 前几天在 csdn 下载资源的时候才发现自己 csdn 有近 200 的下载积分,看了看共享的资源,哈哈 ... 7年前写的五子棋游戏很受欢迎. 下载地址:新手入门五子棋游戏 刚入行的 ...
- wget 官方jdk
每次下载jdk都是一件头疼的事,特别是在服务器上下载. 之前想的是下载到本地,然后通过ftp工具传上去.汗.. 后来想到用wget 直接下载到服务器上. 在网上找了几个例子,wget 加参数,如:wg ...
- react antd layout sider
import React from 'react'; import {Link, withRouter} from 'react-router-dom'; import {Layout, Menu, ...
- http://www.cnblogs.com/peida/archive/2013/05/31/3070790.html深入理解Java:SimpleDateFormat安全的时间格式化
http://www.cnblogs.com/peida/archive/2013/05/31/3070790.html
- js控制iframe的刷新(页面局部刷新)
今天遇到个问题,后台会员审核之后,页面内的会员审核状态要及时改变,但又不能指望用户手动刷新(用户体验很不好) 如果审核页面和显示审核状态时同在一个html页面的话,那么直接用js改变div内部的文本就 ...
- jgit - java实现git操作
在做一个项目中需要用到远程仓库,本来想使用svn的,但是svn的java api网上的资料很少,而且与git相比,svn显得笨重且不方便,因此放弃了svn转而使用git.java git api - ...
- Android实现网易新闻客户端效果
下面来简单实现一下网易新闻客户端左右切换的效果,当然实际项目上肯定不能这样写,还有很多需要优化的地方. activity_main.xml [html] view plaincopyprint? &l ...
- opencv roi resize 会导致内存拷贝产生子图像
opencv roi区域 resize之后,roi的引用已不是原图的引用,而是内存拷贝产生的子图像. http://blog.csdn.net/qianqing13579/article/detail ...