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 ...
随机推荐
- Hyper:基于Hypervisor的容器化解决方案
近日,初创公司HyperHQ发布了他们的开源项目Hyper,Hyper是一个可以在hypervisor上运行Docker镜像的引擎,它融合了Docker容器和虚拟机的优点,旨在打造一个性能更好.更安全 ...
- github上十二款最著名的Android播放器开源项目
1.ijkplayer 项目地址: https://github.com/Bilibili/ijkplayer 介绍:Ijkplayer 是Bilibili发布的基于 FFplay 的轻量级 Andr ...
- tensorflow笔记:模型的保存与训练过程可视化
tensorflow笔记系列: (一) tensorflow笔记:流程,概念和简单代码注释 (二) tensorflow笔记:多层CNN代码分析 (三) tensorflow笔记:多层LSTM代码分析 ...
- X2.5 添加自定义数据调用模块(简单方法)
Discuz!X系列的diy功能还是相当不错的,在对其进行二次开发的过程中,或许需要加入新的数据调用模块,这样可以使你开发的功能模块也像原来的模块一样,只需要点点鼠标,填写一些简单的信息,就可以在各个 ...
- Android ADT远程主机强迫关闭了一个现有的连接 Connection attempts: 1 解决方法
adb有一个限制, 也可以说是bug. 当手机上同时运行的进程数大于64时, 就会引发adb奔溃. 更深层次的原因, 就是windows API的WaitForMultipleObjects所支持的 ...
- WEB-INFO里面的jsp文件不能通过href 访问,而只能通过 servlet访问
href="<%=basePath %>index.jsp"> 这种确实 可以在jsp页面跳转至另一个页面,只不过要放在WEB-INFO外面,也就是项目根目录下面 ...
- Win7系统64位环境下使用Apache——下载mod_jk
转载请注明出处:http://blog.csdn.net/dongdong9223/article/details/70313329 本文出自[我是干勾鱼的博客] 之前在几篇文章: Win7系统64位 ...
- Flash Builder 4.6配置ASDoc
ASDoc是Adobe自带的文档生成工具.可以生成类似JavaDoc格式的文档. 关于ASDoc详情参见官方文档: http://help.adobe.com/zh_CN/flex/using/WSd ...
- (效果一)js实现上拉加载
实现思路:获取滚动元素的高度,滚动条距离顶部的距离,滚动条的高度, 算式:可视窗口的高度 + 滚动条距离顶部的距离 == 滚动条的高度就说明到底部. HTML <!doctype html> ...
- BaseCommand
import java.io.Serializable; import android.util.Log; public class BaseCommand implements Serializab ...