【刷题-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 ...
随机推荐
- mysql表死锁查询
1.查询是否锁表show open tables where in_use>0; 2.查询进程show processlist查询到相对应的进程,然后 kill id 3.查看正在锁的事务sel ...
- yarn 过程中遇到的问题
场景 项目中打包遇到了点问题,所以想删除原先装好的依赖包,重新yarn,结果神奇的报错了,无语... 遇到的问题 (1)error An unexpected error occurred: &quo ...
- JS获取客户的IP地址
这里使用的是第三方的获取方式,重要项目建议不要用,因为你不知道搜狐未来会不会倒闭,,, 搜狐IP地址查询接口(默认GBK):http://pv.sohu.com/cityjson 搜狐IP地址查询接口 ...
- 定义Anroid SO崩溃位置
E:\android-ndk-r13b\toolchains\arm-linux-androideabi-4.9\prebuilt\windows-x86_64\bin> arm-linux-a ...
- 【LeetCode】102. Binary Tree Level Order Traversal 解题报告(Python)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 DFS BFS 日期 题目描述 Given a bi ...
- 【LeetCode】333. Largest BST Subtree 解题报告(C++)
作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 DFS 日期 题目地址:https://leetcod ...
- 【LeetCode】645. Set Mismatch 解题报告(Python)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 Hash方法 直接计算 日期 题目地址: https ...
- 【LeetCode】397. Integer Replacement 解题报告(Python)
[LeetCode]397. Integer Replacement 解题报告(Python) 标签: LeetCode 题目地址:https://leetcode.com/problems/inte ...
- Robot(hdu5673)
Robot Accepts: 92 Submissions: 188 Time Limit: 12000/6000 MS (Java/Others) Memory Limit: 65536/65536 ...
- 1632 B君的连通
B国拥有n个城市,其交通系统呈树状结构,即任意两个城市存在且仅存在一条交通线将其连接.A国是B国的敌国企图秘密发射导弹打击B国的交通线,现假设每条交通线都有50%的概率被炸毁,B国希望知道在被炸毁之后 ...