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. MYSQL分析慢查询

    mysql慢查询的日志文件路径一般为: /var/lib/mysql/slowquery.log,具体的路径可以通过mysql配置文件(/etc/my.cnf)查询,slow_query_log_fi ...

  2. sourceTree git的一些命令

    经常使用的三个命令 1.添加修改过的文件到缓冲区 git add. 2.commit到本地 git commit -am ' 更改描述' 3.如果是多人开发的话,中间可能会有别人先提交的这是就需要先把 ...

  3. jQuery 向另一个页面传参,同时跳转到该页面

    为了使参数能够传递到另外一个页面,使用ajax的跳转方式 $.ajax({ type: "POST", url:"/admin/sysjgl/sysjck/sjcs&qu ...

  4. java类中根据已有的变量复写类的toString方法

    java类中根据已有的变量复写类的toString方法: 在该类中定义好变量之后,shift+alt+s,从出现的列表中点击gemerate toString,就会自动生成对应的toString方法.

  5. 【gRPC使用问题1】gRPC的proto内import其他proto导致的一次小坑

    1.对于一些proto里面的定义,如果包含了 引入其他proto文件的 proto文件来说,生成的时候要注意.尤其是 引入的是官方框架内的 proto文件,如果自己没有提供的话,生成代码会报错! 具体 ...

  6. Linux 编译时内存不足

    1.编译内核出现问题:No space left on device AS      .tmp_kallsyms1.o .tmp_kallsyms1.S:2: fatal error: when wr ...

  7. Eclipse中logcat过滤器的使用

    logcat里信息繁多,用过滤器可以方便快捷的找到我们要查找的信息. 我们可以在打开Eclipse之后,选择Window –> Show View ->Other菜单,然后在Android ...

  8. 比较两个List列表,取得List中不同项返回

    /// <summary> /// 比对模型及属性数组 /// </summary> /// <typeparam name="TM">< ...

  9. javascript数组中数字和非数字下标的区别(转)

    http://blog.csdn.net/qq_27461663/article/details/52014911 考完试后闲来无事,想起好多天没写js了,于是打算实践一下最近看到的一些好玩的点子.结 ...

  10. LoibreOJ 2042. 「CQOI2016」不同的最小割 最小割树 Gomory-Hu tree

    2042. 「CQOI2016」不同的最小割 内存限制:256 MiB时间限制:1000 ms标准输入输出 题目类型:传统评测方式:文本比较 上传者: 匿名 提交提交记录统计讨论测试数据   题目描述 ...