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

知识点: Dijkstra算法; DFS算法

思路:

第一是求最短路径,有相同的则输出时间最短;利用Dijkstra求解,更新最短路时,如果最短路相同,则比较时间

 if(!visited[i]){
if(minl[i]>minD+G_l[minV][i]){
minl[i]=minD+G_l[minV][i];
mint[i]=mint[minV]+G_t[minV][i];
pre_shorest[i]=minV;
}else if(minl[i]==minD+G_l[minV][i]&&
mint[i]>mint[minV]+G_t[minV][i]){
mint[i]=mint[minV]+G_t[minV][i];
pre_shorest[i]=minV;
}
}

第二是求最快路,如果有相同的,输出节点最少的:用Dijkstra算法,设立容器pre来储存每个节点的优选前去节点;然后用DFS来遍历每条路径,选出最少节点的

 for(int i=;i<n;i++){
if(!visited[i]){
if(mint[i]>minD+G_t[minV][i]){
mint[i]=mint[minV]+G_t[minV][i];
pre_faster[i].clear();
pre_faster[i].push_back(minV);
}else if(mint[i]==minD+G_t[minV][i]){
pre_faster[i].push_back(minV);
}
}
}

最后,vector可以比较,相同的情况特殊处理

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 <string>
#include <vector>
using namespace std;
const int maxn = 550;
const int inf = 999999; int n,m;
int G_l[maxn][maxn];
int G_t[maxn][maxn];
int minl[maxn];
int mint[maxn];
int visited[maxn];
int pre_shorest[maxn];
vector<int> pre_faster[maxn];
vector<int> s_path;
vector<int> f_path;
vector<int> f_tmpp;
int minsize; int dijkstra_shorest(int start,int end){
fill(pre_shorest, pre_shorest+maxn, -1);
fill(minl,minl+maxn,inf);
fill(mint,mint+maxn,inf);
fill(visited,visited+maxn,0);
minl[start] = 0;
for(int i=0;i<n;i++){
int minV=-1, minD=inf;
for(int i=0;i<n;i++){
if(minl[i]<minD && !visited[i]){
minV=i;
minD=minl[i];
}
}
if(minV==-1) break;
visited[minV] = 1;
for(int i=0;i<n;i++){
if(!visited[i]){
if(minl[i]>minD+G_l[minV][i]){
minl[i]=minD+G_l[minV][i];
mint[i]=mint[minV]+G_t[minV][i];
pre_shorest[i]=minV;
}else if(minl[i]==minD+G_l[minV][i]&&
mint[i]>mint[minV]+G_t[minV][i]){
mint[i]=mint[minV]+G_t[minV][i];
pre_shorest[i]=minV;
}
}
}
}
int ptr = end;
while(ptr != -1){
//printf(" %d\n",ptr);
s_path.push_back(ptr);
ptr=pre_shorest[ptr];
}
return minl[end];
} void DFS(int v,int start){
f_tmpp.push_back(v);
if(v==start){
if(f_tmpp.size()<minsize){
f_path=f_tmpp;
minsize=f_tmpp.size();
}
f_tmpp.pop_back();
return;
}
for(int i=0;i<pre_faster[v].size();i++){
DFS(pre_faster[v][i], start);
}
f_tmpp.pop_back();
} int dijkstra_fastest(int start,int end){
fill(mint,mint+maxn,inf);
fill(visited,visited+maxn,0);
mint[start] = 0;
for(int i=0;i<n;i++){
int minV=-1, minD=inf;
for(int i=0;i<n;i++){
if(mint[i]<minD && !visited[i]){
minV=i;
minD=mint[i];
}
}
if(minV==-1) break;
//printf(". %d\n",minV);
visited[minV] = 1;
for(int i=0;i<n;i++){
if(!visited[i]){
if(mint[i]>minD+G_t[minV][i]){
mint[i]=mint[minV]+G_t[minV][i];
pre_faster[i].clear();
pre_faster[i].push_back(minV);
}else if(mint[i]==minD+G_t[minV][i]){
pre_faster[i].push_back(minV);
}
}
}
}
minsize = inf;
DFS(end,start);
for(int i=0;i<f_path.size();i++){
//printf("%d\n",f_path[i]);
}
return mint[end];
} int main(int argc, char *argv[]) {
fill(G_l[0],G_l[0]+maxn*maxn,inf);
fill(G_t[0],G_t[0]+maxn*maxn,inf); scanf("%d %d",&n,&m);
int v1,v2,oneway,len,tim;
for(int i=0;i<m;i++){
scanf("%d %d %d %d %d",&v1,&v2,&oneway,&len,&tim);
if(!oneway){
G_l[v1][v2]=len;
G_l[v2][v1]=len;
G_t[v1][v2]=tim;
G_t[v2][v1]=tim;
}else{
G_l[v1][v2]=len;
G_t[v1][v2]=tim;
}
}
scanf("%d %d",&v1,&v2); int D = dijkstra_shorest(v1,v2); int T = dijkstra_fastest(v1,v2); if(s_path==f_path){
printf("Distance = %d; Time = %d: ",D,T);
for(int i=s_path.size()-1;i>=0;i--){
printf("%d",s_path[i]);
if(i!=0) printf(" -> ");
}
}else{
printf("Distance = %d: ",D);
for(int i=s_path.size()-1;i>=0;i--){
printf("%d",s_path[i]);
if(i!=0) printf(" -> ");
}
printf("\nTime = %d: ",T);
for(int i=f_path.size()-1;i>=0;i--){
printf("%d",f_path[i]);
if(i!=0) printf(" -> ");
}
}
}

 

1111 Online Map (30 分)的更多相关文章

  1. 【PAT甲级】1111 Online Map (30分)(dijkstra+路径记录)

    题意: 输入两个正整数N和M(N<=500,M<=N^2),分别代表点数和边数.接着输入M行每行包括一条边的两个结点(0~N-1),这条路的长度和通过这条路所需要的时间.接着输入两个整数表 ...

  2. 1111 Online Map (30)(30 分)

    Input our current position and a destination, an online map can recommend several paths. Now your jo ...

  3. PAT (Advanced Level) 1111. Online Map (30)

    预处理出最短路再进行暴力dfs求答案会比较好.直接dfs效率太低. #include<cstdio> #include<cstring> #include<cmath&g ...

  4. 1111. Online Map (30)

    Input our current position and a destination, an online map can recommend several paths. Now your jo ...

  5. PAT Advanced 1111 Online Map (30) [Dijkstra算法 + DFS]

    题目 Input our current position and a destination, an online map can recommend several paths. Now your ...

  6. PAT甲题题解-1111. Online Map (30)-PAT甲级真题(模板题,两次Dijkstra,同时记下最短路径)

    题意:给了图,以及s和t,让你求s到t花费的最短路程.最短时间,以及输出对应的路径.   对于最短路程,如果路程一样,输出时间最少的. 对于最短时间,如果时间一样,输出节点数最少的.   如果最短路程 ...

  7. PAT-1111 Online Map (30分) 最短路+dfs

    明天就要考PAT,为了应付期末已经好久没有刷题了啊啊啊啊,今天开了一道最短路,状态不是很好 1.没有读清题目要求,或者说没有读完题目,明天一定要注意 2.vis初始化的时候从1初始化到n,应该从0开始 ...

  8. PAT甲级——1111 Online Map (单源最短路经的Dijkstra算法、priority_queue的使用)

    本文章同步发布在CSDN:https://blog.csdn.net/weixin_44385565/article/details/90041078   1111 Online Map (30 分) ...

  9. 1111 Online Map (30 分)

    1111 Online Map (30 分) Input our current position and a destination, an online map can recommend sev ...

随机推荐

  1. Java并发集合(三)-ConcurrentHashMap分析和使用

    1 http://ifeve.com/hashmap-concurrenthashmap-%E7%9B%B8%E4%BF%A1%E7%9C%8B%E5%AE%8C%E8%BF%99%E7%AF%87% ...

  2. andorid 全部对话框

    .xml <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android ...

  3. 引爆你的Javascript代码进化

    转自:http://www.hicss.net/evolve-your-javascript-code/ 方才在程序里看到一段JS代码,写法极为高明,私心想着若是其按照规范来写,定可培养对这门语言的理 ...

  4. 【解决办法--实测可行】Partition 1 does not start on physical sector boundary.

    新的硬盘使用fdisk进行划分的时候有提示Partition 1 does not start on physical sector boundary.后面按网上找的办法,在fdisk进行分区的时候, ...

  5. abp项目中无法使用HttpContext.Current.Session[""]的问题

    web项目Global.asax.cs中加入如下代码 public override void Init() { this.PostAuthenticateRequest += (sender, e) ...

  6. h5解决移动端上滑卡顿问题

    select{ -webkit-overflow-scrolling: touch;/*解决移动端滑动卡顿问题*/ -webkit-transform: translateZ(0px);/*开启GPU ...

  7. js值类型与引用类型

    JavaScript值类型和引用类型有哪些 (1)值类型:数值.布尔值.null.undefined. (2)引用类型:对象.数组.函数. 三.如何理解值类型和引用类型及举例 我们可以用“连锁店”和“ ...

  8. sim卡联系人name为空的问题。

    1,之前的版本出现Bug:新建name为空的sim卡联系人,无法删除. 解决: 2,而后的版本出现新Bug:新建name不为空,Num不为空的sim卡联系人,然后编辑sim卡联系人,将Name清空,无 ...

  9. [C#.net]Connection Timeout和Command Timeout

    每次对数据库连接时,我们有时候会碰到连接超时或者命令超时,这两个超时是不一样的.以ADO.NET为例,当客户端和服务器端连接时,碰到的超时情况主要有下面几种: 当从连接池获取一个连接时,碰到超时. 当 ...

  10. Anaconda 3中配置OpenCV

    平台:win10 x64+Anaconda 3(64-bit)+opencv_python-3.4.5+contrib-cp37-cp37m-win_amd64 一.OpenCV下载 Python环境 ...