1111. Online Map (30)
Input our current position and a destination, an online map can recommend several paths. Now your job is to recommend two paths to your user: one is the shortest, and the other is the fastest. It is guaranteed that a path exists for any request.
Input Specification:
Each input file contains one test case. For each case, the first line gives two positive integers N (2 <= N <= 500), and M, being the total number of streets intersections on a map, and the number of streets, respectively. Then M lines follow, each describes a street in the format:
V1 V2 one-way length time
where V1 and V2 are the indices (from 0 to N-1) of the two ends of the street; one-way is 1 if the street is one-way from V1 to V2, or 0 if not; length is the length of the street; and time is the time taken to pass the street.
Finally a pair of source and destination is given.
Output Specification:
For each case, first print the shortest path from the source to the destination with distance D in the format:
Distance = D: source -> v1 -> ... -> destination
Then in the next line print the fastest path with total time T:
Time = T: source -> w1 -> ... -> destination
In case the shortest path is not unique, output the fastest one among the shortest paths, which is guaranteed to be unique. In case the fastest path is not unique, output the one that passes through the fewest intersections, which is guaranteed to be unique.
In case the shortest and the fastest paths are identical, print them in one line in the format:
Distance = D; Time = T: source -> u1 -> ... -> destination
Sample Input 1:
10 15
0 1 0 1 1
8 0 0 1 1
4 8 1 1 1
3 4 0 3 2
3 9 1 4 1
0 6 0 1 1
7 5 1 2 1
8 5 1 2 1
2 3 0 2 2
2 1 1 1 1
1 3 0 3 1
1 4 0 1 1
9 7 1 3 1
5 1 0 5 2
6 5 1 1 2
3 5
Sample Output 1:
Distance = 6: 3 -> 4 -> 8 -> 5
Time = 3: 3 -> 1 -> 5
Sample Input 2:
7 9
0 4 1 1 1
1 6 1 1 3
2 6 1 1 1
2 5 1 2 2
3 0 0 1 1
3 1 1 1 3
3 2 1 1 2
4 5 0 2 2
6 5 1 1 2
3 5
Sample Output 2:
Distance = 3; Time = 4: 3 -> 2 -> 5
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
const int maxn = , inf = 0x7fffffff;
struct Arc{
int v;
int tim, len;
};
vector<Arc> arc[maxn];
int N, M, dis[maxn], tim[maxn], pre[maxn], pathLen[maxn], S, T;
vector<int> disPath, timPath, tempPath; void scan(){
scanf("%d%d", &N, &M);
for(int i = ; i < M; ++ i){
int v1, v2, oneWay;
Arc t;
scanf("%d%d%d%d%d", &v1, &v2, &oneWay, &t.len, &t.tim);
t.v = v2; arc[v1].push_back(t);
if(!oneWay) t.v = v1, arc[v2].push_back(t);
}
scanf("%d%d", &S, &T);
} void dijkstra_dis(int s){
bool vis[maxn];
fill(vis, vis+maxn, false);
fill(dis, dis+maxn, inf);
fill(tim, tim+maxn, inf);
dis[s] = tim[s] = ;
for(int i = ; i < N; ++ i){
int u = -, minDis = inf;
for(int j = ; j < N; ++ j){
if(!vis[j] && dis[j] < minDis){
minDis = dis[j];
u = j;
}
}
if(u == -) return;
vis[u] = true;
for(int k = ; k < arc[u].size(); ++ k){
int v = arc[u][k].v;
if(!vis[v]){
if(dis[u] + arc[u][k].len < dis[v]){
dis[v] = dis[u] + arc[u][k].len;
tim[v] = tim[u] + arc[u][k].tim;
pre[v] = u;
}else if(dis[u] + arc[u][k].len == dis[v] && tim[u] + arc[u][k].tim < tim[v]){
tim[v] = tim[u] + arc[u][k].tim;
pre[v] = u;
}
}
}
}
} void dijkstra_tim(int s){
bool vis[maxn];
fill(vis, vis+maxn, false);
fill(tim, tim+maxn, inf);
fill(pathLen, pathLen+maxn, inf);
tim[s] = , pathLen[s] = ;
for(int i = ; i < N; i ++){
int u = -, minTim = inf;
for(int j = ; j < N; j ++){
if(!vis[j] && tim[j] < minTim){
minTim = tim[j];
u = j;
}
}
if(u == -) return;
vis[u] = true;
for(int k = ; k < arc[u].size(); k ++){
int v = arc[u][k].v;
if(!vis[v]){
if(tim[u] + arc[u][k].tim < tim[v]){
tim[v] = tim[u] + arc[u][k].tim;
pre[v] = u;
pathLen[v] = pathLen[u] + ;
}else if(tim[u] + arc[u][k].tim == tim[v] && pathLen[u]+ < pathLen[v]){
pre[v] = u;
pathLen[v] = pathLen[u] + ;
}
}
}
}
} void dfs(int t){
tempPath.push_back(t);
if(pre[t] != -){
dfs(pre[t]);
}
} void printPath(vector<int> &path){
for(int i = path.size()-; i >= ; -- i){
printf("%d", path[i]);
if(i != ) printf(" -> ");
}
printf("\n");
} int main()
{
fill(pre, pre+maxn, -);
scan();
dijkstra_dis(S);
dfs(T);
disPath = tempPath;
fill(pre, pre+maxn, -);
dijkstra_tim(S);
tempPath.clear();//clear data
dfs(T);
timPath = tempPath;
if(timPath == disPath){
printf("Distance = %d; Time = %d: ", dis[T], tim[T]);
printPath(disPath);
}else{
printf("Distance = %d: ", dis[T]); printPath(disPath);
printf("Time = %d: ", tim[T]); printPath(timPath);
}
return ;
}
1111. Online Map (30)的更多相关文章
- PAT (Advanced Level) 1111. Online Map (30)
预处理出最短路再进行暴力dfs求答案会比较好.直接dfs效率太低. #include<cstdio> #include<cstring> #include<cmath&g ...
- 1111 Online Map (30)(30 分)
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 ...
- PAT甲题题解-1111. Online Map (30)-PAT甲级真题(模板题,两次Dijkstra,同时记下最短路径)
题意:给了图,以及s和t,让你求s到t花费的最短路程.最短时间,以及输出对应的路径. 对于最短路程,如果路程一样,输出时间最少的. 对于最短时间,如果时间一样,输出节点数最少的. 如果最短路程 ...
- 【PAT甲级】1111 Online Map (30分)(dijkstra+路径记录)
题意: 输入两个正整数N和M(N<=500,M<=N^2),分别代表点数和边数.接着输入M行每行包括一条边的两个结点(0~N-1),这条路的长度和通过这条路所需要的时间.接着输入两个整数表 ...
- 1111 Online Map (30 分)
1111. Online Map (30)Input our current position and a destination, an online map can recommend sever ...
- PAT甲级——1111 Online Map (单源最短路经的Dijkstra算法、priority_queue的使用)
本文章同步发布在CSDN:https://blog.csdn.net/weixin_44385565/article/details/90041078 1111 Online Map (30 分) ...
- 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[Dijkstra][dfs]
1111 Online Map(30 分) Input our current position and a destination, an online map can recommend seve ...
随机推荐
- Java数据类型(Primivite 和引用数据类型!)
一.byte(8位) short(16位) int(32位) long(64位) float(32位) double(64位) boolean(Java虚拟机决定) true 或者false! ...
- spark2.4.0+hadoop2.8.3全分布式集群搭建
集群环境 hadoop-2.8.3搭建详细请查看hadoop系列文章 scala-2.11.12环境请查看scala系列文章 jdk1.8.0_161 spark-2.4.0-bin-hadoop2. ...
- Unix shell范例精解 课后题
1.read #屏幕输入read name #输入名字 2.echo #在终端打印出内容echo "What is your name ?" # What is your n ...
- NTP时间服务
时间服务 NTP:Network Time Protocol 作用:用来给其他主机提供时间同步服务 NTP的配置文件 /etc/ntp.conf NTP相关的命令 date:显示/修改系统时间 hwc ...
- 使用phxpaxos开发过程中遇到的坑
1. 开启BatchPropose后,状态机使用ExecuteForCheckpoint生成快照要注意: ExecuteForCheckpoint中的InstanceID不能立即持久化. 例如: 当i ...
- openstack使用openvswitch实现vxlan的方法
openstack使用openvswitch实现vxlan,分享给大家,具体如下: openstack环境: 1 版本:ocata 2 系统:ubuntu16.04.2 3 控制节点 1个 + 计算节 ...
- Navicat Premium 12注册机使用教程
来看下软件具体的安装.激活图文教程: 1.首先下载后正常安装软件至结束: 这时候如果打开的话,是提示要注册的 2.以管理员身份运行注册机工具 Navicat_Keygen_Patch[vxia.net ...
- hbase-hive整合及sqoop的安装配置使用
从hbase中拿数据,然后整合到hbase中 上hive官网 -- 点击wiki--> hive hbase integation(整合) --> 注意整合的时候两个软件的版本要能进行整 ...
- Python库 - Albumentations 图片数据增强库
Python图像处理库 - Albumentations,可用于深度学习中网络训练时的图片数据增强. Albumentations 图像数据增强库特点: 基于高度优化的 OpenCV 库实现图像快速数 ...
- python基础之socket编程
一 客户端/服务器架构 二 osi七层 三 socket层 四 socket是什么 五 套接字发展史及分类 六 套接字工作流程 七 基于TCP的套接字 八 基于UDP的套接字 九 粘包现象 十 什么是 ...