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. Vue-CLI3.x 高版本覆盖低版本Vue-CLI2.x 解决方法

    因为Vue-cli 3 和旧版使用了相同的vue命令,所以Vue CLI 2(vue-cli) 被覆盖了.如果你任然需要旧版本的 vue init 功能 ,你可以全局安装一个交接工具: npm ins ...

  2. 探索未知种族之osg类生物---呼吸分解之事件循环一

    事件循环和更新循环 终于到了我们嘴里经常念叨的事件循环.更新循环以及渲染循环了.首先我们来区分一下事件循环和渲染循环,他们两个首先是两个不同顺序执行的过程,我们有时候会用到任意node的updateC ...

  3. Pycharm的常用快捷将

    程序运行 Shift+alt+F10 执行程序 debug调试 Shift+alt+F9 Debug调试Shift + F9 对当前文件进行DebugF8 调试模式下 跳过F7 调试模式下 进入F9 ...

  4. [SoapUI] 从Map里面不想要的键值对

    def keysToRemoveForBoss = ["RequestIdBmk", "RequestIdTest"] def extraInfoMapForB ...

  5. 我的MVP呢?

    Ladies and gentelmen, welcome the MVP of NBA 16-2017 Season:... 呃,等下,好像哪里不对.那是因为,我要说的MVP根本就不是Most Va ...

  6. windows 与 Linux SOCKET通讯

    windows client 端口 // Def_win_client_socket_test.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" ...

  7. vue动态路由配置,vue路由传参

    动态路由: 当我们很多个页面或者组件都要被很多次重复利用的时候,我们的路由都指向同一个组件,这时候从不同组件进入一个"共用"的组件,并且还要传参数,渲染不同的数据 这就要用到动态路 ...

  8. docker下安装tensorflow

    一,查找镜像 root@xushi:~# docker search tensorflow NAME DESCRIPTION STARS OFFICIAL AUTOMATED tensorflow/t ...

  9. datagrid 扩展 页脚 合计功能

    效果图:合计信息展示在页脚中(showFooter:true) code: <!DOCTYPE html> <html> <head> <meta chars ...

  10. msgs no .h file

    1.单独编译包,catkin_make --pkg 包名,failed,则 2.进入build下对应的msgs包中,使用make,以及make install,failed,则 3.使用catkin_ ...