【刷题-PAT】A1111 Online Map (30 分)
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
分析:dijkstra + dfs,先找出最短路径,再dfs出最短路径,根据题目中tie的处理方式选择出最终的路径
#include<iostream>
#include<cstdio>
#include<vector>
#include<string>
#include<unordered_map>
#include<set>
#include<queue>
#include<algorithm>
#include<cmath>
using namespace std;
const int nmax = 510, inf = (1 << 31) - 1;
struct node{
int v, len, t;
};
vector<node>G[nmax];
int d[nmax], td[nmax], t[nmax], preV[nmax];
vector<int>pret[nmax];
bool visv[nmax] = {false}, vist[nmax] = {false};
void dij(int s, int n){
fill(d, d + nmax, inf);
fill(td, td + nmax, inf);
fill(t, t + nmax, inf);
d[s] = 0, td[s] = 0, t[s] = 0;
for(int i = 0; i < n; ++i){
int u = -1, MIN = inf;
for(int j = 0; j < n; ++j){
if(visv[j] == false && d[j] < MIN){
MIN = d[j];
u = j;
}
}
if(u == -1)return;
visv[u] = true;
for(int j = 0; j < G[u].size(); ++j){
int v = G[u][j].v;
if(visv[v] == false){
if(d[u] + G[u][j].len < d[v]){
d[v] = d[u] + G[u][j].len;
td[v] = td[u] + G[u][j].t;
preV[v] = u;
}else if(d[u] + G[u][j].len == d[v] && td[u] + G[u][j].t < td[v]){
td[v] = td[u] + G[u][j].t;
preV[v] = u;
}
}
}
u = -1, MIN = inf;
for(int j = 0; j < n; ++j){
if(vist[j] == false && t[j] < MIN){
MIN = t[j];
u = j;
}
}
if(u == -1)return;
vist[u] = true;
for(int j = 0; j < G[u].size(); ++j){
int v = G[u][j].v;
if(vist[v] == false){
if(t[u] + G[u][j].t < t[v]){
t[v] = t[u] + G[u][j].t;
pret[v].clear();
pret[v].push_back(u);
}else if(t[u] + G[u][j].t == t[v]){
pret[v].push_back(u);
}
}
}
}
}
vector<int>pathv;
void dfs1(int s, int e){
pathv.push_back(s);
if(s == e)return;
dfs1(preV[s], e);
}
vector<int>patht, temp;
int intermin = inf;
void dfs2(int s, int e){
temp.push_back(s);
if(s == e){
if(temp.size() < intermin){
intermin = temp.size();
patht = temp;
}
return;
}
for(int i = 0; i < pret[s].size(); ++i){
dfs2(pret[s][i], e);
temp.pop_back();
}
}
void Print(vector<int> &path){
for(int i = path.size() - 1; i >= 0; --i){
printf("%d", path[i]);
if(i > 0)printf(" -> ");
else printf("\n");
}
}
int main(){
#ifdef ONLINE_JUDGE
#else
freopen("input.txt", "r", stdin);
#endif // ONLINE_JUDGE
int n, m;
scanf("%d%d", &n, &m);
for(int i = 0; i < m; ++i){
int v1, v2, tag, len, t;
scanf("%d%d%d%d%d", &v1, &v2, &tag, &len, &t);
G[v1].push_back({v2, len, t});
if(tag == 0)G[v2].push_back({v1, len, t});
}
int s, e;
scanf("%d%d", &s, &e);
dij(s, n);
dfs1(e, s);
dfs2(e, s);
bool flag = false;
if(patht.size() == pathv.size()){
int i = 0;
while(i < patht.size() && pathv[i] == patht[i])i++;
if(i == patht.size())flag = true;
}
printf("Distance = %d", d[e]);
if(flag == false){
printf(": ");
Print(pathv);
}else{
printf("; ");
}
printf("Time = %d: ", t[e]);
Print(patht);
return 0;
}
【刷题-PAT】A1111 Online Map (30 分)的更多相关文章
- 牛客网刷题(纯java题型 1~30题)
牛客网刷题(纯java题型 1~30题) 应该是先extend,然后implement class test extends A implements B { public static void m ...
- 【刷题-PAT】A1135 Is It A Red-Black Tree (30 分)
1135 Is It A Red-Black Tree (30 分) There is a kind of balanced binary search tree named red-black tr ...
- 【刷题-PAT】A1119 Pre- and Post-order Traversals (30 分)
1119 Pre- and Post-order Traversals (30 分) Suppose that all the keys in a binary tree are distinct p ...
- 【刷题-PAT】A1095 Cars on Campus (30 分)
1095 Cars on Campus (30 分) Zhejiang University has 8 campuses and a lot of gates. From each gate we ...
- PAT-1111 Online Map (30分) 最短路+dfs
明天就要考PAT,为了应付期末已经好久没有刷题了啊啊啊啊,今天开了一道最短路,状态不是很好 1.没有读清题目要求,或者说没有读完题目,明天一定要注意 2.vis初始化的时候从1初始化到n,应该从0开始 ...
- PAT 1004 Counting Leaves (30分)
1004 Counting Leaves (30分) A family hierarchy is usually presented by a pedigree tree. Your job is t ...
- [PAT] 1147 Heaps(30 分)
1147 Heaps(30 分) In computer science, a heap is a specialized tree-based data structure that satisfi ...
- PAT 甲级 1147 Heaps (30 分) (层序遍历,如何建树,后序输出,还有更简单的方法~)
1147 Heaps (30 分) In computer science, a heap is a specialized tree-based data structure that sati ...
- PAT 甲级1057 Stack (30 分)(不会,树状数组+二分)*****
1057 Stack (30 分) Stack is one of the most fundamental data structures, which is based on the prin ...
随机推荐
- Ribbon——负载均衡
一.什么是Ribbon Ribbon是Netflix发布的开源项目,主要功能是提供客户端的软件负载均衡算法,将Netflix的中间层服务连接在一起.Ribbon客户端组件提供一系列完善的配置项如连接超 ...
- Linux的课堂便利脚本
上课的时,因为教室机总会重新重启,有时候就要重配网卡yum源和下载一些辅助工具,这里写一个脚本省去冗杂的过程 if [[]]可以防止unary operator expected的报错 nmcli d ...
- 【LeetCode】47. Permutations II 解题报告(Python & C++)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 方法一:递归 方法二:回溯法 日期 题目地址:htt ...
- 1033 - Generating Palindromes
1033 - Generating Palindromes PDF (English) Statistics Forum Time Limit: 2 second(s) Memory Limit ...
- Iptables 实操
目录 Iptables之实操 简介 名称概念: 四表中常用的表 Nat表 Filter表 iptables表和链的工作流程图 iptables过滤图 Iptables安装 Iptables 命令说明 ...
- 来自Java程序员的Python新手入门小结
欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...
- Sublime Text 3菜单栏隐藏后怎么显示
Sublime Text 3如何显示菜单栏 今天在使用Sublime Text 3敲代码的时候不小心就把上侧的菜单栏隐藏了,自己鼓捣了半天才把菜单栏弄出来,下面我就给大家讲解一下我是如何操作的 键盘按 ...
- A New Defense Against Adversarial Images: Turning a Weakness into a Strength
目录 概 主要内容 准则1 准则2 总策略 Hu S, Yu T, Guo C, et al. A New Defense Against Adversarial Images: Turning a ...
- Gradient-based Hyperparameter Optimization through Reversible Learning
目录 概 主要内容 算法 finite precision arithmic 实验 Maclaurin D, Duvenaud D, Adams R P, et al. Gradient-based ...
- .NET 云原生架构师训练营(ASP .NET Core 整体概念推演)--学习笔记
演化与完善整体概念 ASP .NET Core 整体概念推演 整体概念推演到具体的形式 ASP .NET Core 整体概念推演 ASP .NET Core 其实就是通过 web framework ...