PAT Advanced 1111 Online Map (30) [Dijkstra算法 + DFS]
题目
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回溯路径,并保存到vector dispath
- Dijkstra求耗时最少路径,若耗时最少路径有多条,取其中经过顶点最少
- dfs回溯路径,并保存到vector Timepath
知识点
比较两个路径是否相同,可以将路径保存于两个vector
vector<int> path1,path2;
if(path1==path2){
//路径相同
}
Code
#include <iostream>
#include <vector>
using namespace std;
const int inf=0x7fffffff;
const int maxn=510;
int n,m,e[maxn][maxn],w[maxn][maxn],st,fin;
int dis[maxn],dispre[maxn],Timepre[maxn],visit[maxn],weight[maxn],Time[maxn],NodeNum[maxn];
vector<int> dispath,Timepath,temppath;
void dfsdispath(int x) {
if(x==-1)return;
dispath.push_back(x);
dfsdispath(dispre[x]);
}
void dfsTimepath(int x) {
if(x==-1)return;
Timepath.push_back(x);
dfsTimepath(Timepre[x]);
}
int main(int argc,char * argv[]) {
scanf("%d %d",&n,&m);
int v1,v2,flag,len,time;
for(int i=0; i<m; i++) {
scanf("%d %d %d %d %d",&v1,&v2,&flag,&len,&time);
e[v1][v2]=len;
w[v1][v2]=time;
if(flag!=1) {
e[v2][v1]=len;
w[v2][v1]=time;
}
}
scanf("%d %d",&st,&fin);
// 寻找最短距离,耗时最短的路径
fill(dis,dis+n,inf);
fill(dispre,dispre+n,-1);
fill(weight,weight+n,inf);
dis[st]=0;
weight[st]=0;
for(int i=0; i<n; i++) {
int u=-1,minn=inf;
for(int j=0; j<n; j++) {
if(visit[j]==false&&dis[j]<minn) {
u=j;
minn=dis[j];
}
}
if(u==-1||u==fin)break;
visit[u]=true;
for(int v=0; v<n; v++) {
if(e[u][v]==0||visit[v]==true)continue;
if(e[u][v]+dis[u]<dis[v]) {
dis[v]=e[u][v]+dis[u];
dispre[v]=u;
weight[v]=w[u][v]+weight[u];
} else if(e[u][v]+dis[u]==dis[v]&&weight[v]>w[u][v]+weight[u]) {
// 取所有距离最短中的时间最短路径
dispre[v]=u;
weight[v]=w[u][v]+weight[u];
}
}
}
dfsdispath(fin);
fill(Time,Time+n,inf);
fill(Timepre,Timepre+n,-1);
fill(visit,visit+n,0);
fill(NodeNum,NodeNum+n,inf);
Time[st]=0;
NodeNum[st]=0;
for(int i=0; i<n; i++) {
int u=-1,minn=inf;
for(int j=0; j<n; j++) {
if(visit[j]==false&&Time[j]<minn) {
u=j;
minn=Time[j];
}
}
if(u==-1||u==fin)break;
visit[u]=true;
for(int v=0; v<n; v++) {
if(w[u][v]==0||visit[v]==true)continue;
if(w[u][v]+Time[u]<Time[v]) {
Time[v]=w[u][v]+Time[u];
Timepre[v]=u;
NodeNum[v]=1+NodeNum[u];
} else if(w[u][v]+Time[u]==Time[v]&&NodeNum[v]>1+NodeNum[u]) {
// 取所有距离最短中的时间最短路径
Timepre[v]=u;
NodeNum[v]=1+NodeNum[u];
}
}
}
dfsTimepath(fin);
printf("Distance = %d",dis[fin]);
if(dispath==Timepath) {
printf("; Time = %d: ",Time[fin]);
} else {
printf(": ");
for(int i=dispath.size()-1;i>=0;i--){
printf("%d",dispath[i]);
if(i!=0)printf(" -> ");
}
printf("\nTime = %d: ",Time[fin]);
}
for(int i=Timepath.size()-1;i>=0;i--){
printf("%d",Timepath[i]);
if(i!=0)printf(" -> ");
}
return 0;
}

PAT Advanced 1111 Online Map (30) [Dijkstra算法 + DFS]的更多相关文章
- PAT Advanced 1030 Travel Plan (30) [Dijkstra算法 + DFS,最短路径,边权]
题目 A traveler's map gives the distances between cities along the highways, together with the cost of ...
- PAT Advanced 1072 Gas Station (30) [Dijkstra算法]
题目 A gas station has to be built at such a location that the minimum distance between the station an ...
- PAT Advanced 1018 Public Bike Management (30) [Dijkstra算法 + DFS]
题目 There is a public bike service in Hangzhou City which provides great convenience to the tourists ...
- 1018 Public Bike Management (30) Dijkstra算法 + DFS
题目及题解 https://blog.csdn.net/CV_Jason/article/details/81385228 迪杰斯特拉重新认识 两个核心的存储结构: int dis[n]: //记录每 ...
- PAT Advanced 1004 Counting Leaves (30) [BFS,DFS,树的层序遍历]
题目 A family hierarchy is usually presented by a pedigree tree. Your job is to count those family mem ...
- PAT甲级——1111 Online Map (单源最短路经的Dijkstra算法、priority_queue的使用)
本文章同步发布在CSDN:https://blog.csdn.net/weixin_44385565/article/details/90041078 1111 Online Map (30 分) ...
- PAT甲级1111. Online Map
PAT甲级1111. Online Map 题意: 输入我们当前的位置和目的地,一个在线地图可以推荐几条路径.现在你的工作是向你的用户推荐两条路径:一条是最短的,另一条是最快的.确保任何请求存在路径. ...
- PAT (Advanced Level) 1111. Online Map (30)
预处理出最短路再进行暴力dfs求答案会比较好.直接dfs效率太低. #include<cstdio> #include<cstring> #include<cmath&g ...
- PAT甲题题解-1111. Online Map (30)-PAT甲级真题(模板题,两次Dijkstra,同时记下最短路径)
题意:给了图,以及s和t,让你求s到t花费的最短路程.最短时间,以及输出对应的路径. 对于最短路程,如果路程一样,输出时间最少的. 对于最短时间,如果时间一样,输出节点数最少的. 如果最短路程 ...
随机推荐
- SciPy 线性代数
章节 SciPy 介绍 SciPy 安装 SciPy 基础功能 SciPy 特殊函数 SciPy k均值聚类 SciPy 常量 SciPy fftpack(傅里叶变换) SciPy 积分 SciPy ...
- C++ 类 与 static
背景 从学习C++到使用现在,发现很多新的东西,正好整理一下. static 为静态,指是当类编译加载的时候,内存就会开辟存储空间的. static 数据成员 在类中,static 可修饰 类中的成员 ...
- zabbix java gateway配置实战案例
zabbix java gateway配置实战案例 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.部署tomcat服务 博主推荐阅读: CentOS: https://www. ...
- 牛客小白月赛3---G 旅游(树形dp)
题目链接:https://www.nowcoder.com/acm/contest/87/G 分析: 1.对于点cur,dp[cur][0]表示在该点住宿:dp[cur][1]表示其某个子结点住宿,自 ...
- CSS - flex使行内元素快速对齐
div{ display:flex; alian-items:center; //使垂直对齐 justify-content:center //使水平对齐 }
- 文本情感分析(二):基于word2vec、glove和fasttext词向量的文本表示
上一篇博客用词袋模型,包括词频矩阵.Tf-Idf矩阵.LSA和n-gram构造文本特征,做了Kaggle上的电影评论情感分类题. 这篇博客还是关于文本特征工程的,用词嵌入的方法来构造文本特征,也就是用 ...
- 054、Java中使用for循环第二种写法实现1~100的累加
01.代码如下: package TIANPAN; /** * 此处为文档注释 * * @author 田攀 微信382477247 */ public class TestDemo { public ...
- 014.Delphi插件之QPlugins,MDI窗口
不知道为什么,这个DEMO编译出来报错,运行不了,在QDAC群里问了一下也没人响应. 效果如下 主程序代码如下 unit Frm_Main; interface uses Winapi.Windows ...
- System.Reflection.ReflectionTypeLoadException
引用了一个第三方dll, 此dll经过混淆,但是未签名. 然后,主程序无法反射了, 取消主程序的签名后正常反射.
- (九)微信小程序---for指令
对于数据是列表 wxml <view wx:for="{{dataList}}">{{index}}-{{item}}</view> 我们可以看到上面的代码 ...