PAT甲级1111. Online Map

题意:

输入我们当前的位置和目的地,一个在线地图可以推荐几条路径。现在你的工作是向你的用户推荐两条路径:一条是最短的,另一条是最快的。确保任何请求存在路径。

输入规格:

每个输入文件包含一个测试用例。对于每种情况,

第一行给出两个正整数N(2 <= N <= 500),M分别是地图上街道交叉路口的总数和街道数。然后M行跟随,每个描述一个街道的格式:

V1 V2单程长度时间

其中V1和V2是街道两端的索引(从0到N-1);一-

方式是1,如果街道从V1到V2是单向的,或者如果没有,则为0;长度是街道的长度;时间是通过街道的时间。

最后给出一对源和目的地。

输出规格:

对于每种情况,首先打印距离为D的源到目的地的最短路径,格式如下:

距离= D:源 - > v1 - > ... - >目的地

然后在下一行打印总时间最快的路径T:

时间= T:源 - > w1 - > ... - >目的地

如果最短路径不唯一,则输出最短路径中最快的路径,这被保证是唯一的。如果最快的路径不是唯一的,

输出通过最少交叉路口的路口,这被保证是唯一的。

如果最短和最快的路径相同,请以以下格式打印一行:

距离= D;时间= T:源 - > u1 - > ... - >目的地

思路:

Dijkstra + dfs.写了一个小时,有点慢。

ac代码:

C++

// pat1111.cpp : 定义控制台应用程序的入口点。
// #include "stdafx.h" #include<iostream>
#include<cstdio>
#include<string>
#include<algorithm>
#include<queue>
#include<vector>
#include<cstring>
#include<stdio.h>
#include<map>
#include<cmath>
#include<unordered_map>
#include<unordered_set> using namespace std; int n, m;
int starting, destination;
int mymap[501][501];
int mytime[501][501];
int visit[501];
int len[501];
int vec[501];
int disway[501];
int timeway[501];
int temp[501];
int short_time = -1;
int time_len = -1;
int dlen = 0,time_dis = 0; void Dijkstra()
{
int now = -1; memset(visit, 0, sizeof(visit));
memset(len, -1, sizeof(len));
len[starting] = 0;
while (1)
{
now = -1;
for (int i = 0; i < n; i++)
{
if (!visit[i] && len[i] != -1 && (now == -1 || len[i] < len[now])) now = i;
}
if (now == -1) break;
visit[now] = 1;
for (int i = 0; i < n; i++)
{
if (!visit[i] && mymap[now][i] && (len[i] == -1 || mymap[now][i] + len[now] < len[i] ))
len[i] = mymap[now][i] + len[now];
}
} memset(vec, -1, sizeof(vec));
memset(visit, 0, sizeof(visit));
vec[starting] = 0;
while (1)
{
now = -1;
for (int i = 0; i < n; i++)
{
if (!visit[i] && vec[i] != -1 && (now == -1 || vec[i] < vec[now])) now = i;
}
if (now == -1) break;
visit[now] = 1;
for (int i = 0; i < n; i++)
{
if (!visit[i] && mytime[now][i] && (vec[i] == -1 ||mytime[now][i] + vec[now] < vec[i]))
vec[i] = mytime[now][i] + vec[now];
}
} } void dfs(int cur, int dis, int time, int pos)
{
if (dis > len[destination] && time > vec[destination]) return;
if (dis == len[destination] && cur == destination)
{
if (short_time == -1 || time < short_time)
{
short_time = time;
dlen = pos;
for (int i = 0; i < pos; i++)
disway[i] = temp[i];
}
}
if (time == vec[destination] && cur == destination)
{
if (time_len == -1 || pos < time_len)
{
time_len = pos;
time_dis = dis;
for (int i = 0; i < pos; i++)
timeway[i] = temp[i];
}
} for (int i = 0; i < n; i++)
{
if (!visit[i] && mymap[cur][i])
{
temp[pos] = i;
dfs(i, dis + mymap[cur][i], time + mytime[cur][i], pos + 1);
}
} } int main()
{
//input
scanf("%d %d", &n, &m);
int v1, v2, is_one, l, t;
for (int i = 0; i < m; i++)
{
scanf("%d %d %d %d %d", &v1, &v2, &is_one, &l, &t);
if (is_one)
{
mymap[v1][v2] = l;
mytime[v1][v2] = t;
}
else
{
mymap[v1][v2] = mymap[v2][v1] = l;
mytime[v1][v2] = mytime[v2][v1] = t;
}
}
scanf("%d %d", &starting, &destination); Dijkstra(); memset(visit, 0, sizeof(visit));
//temp[0] = starting;
dfs(starting,0,0,0); if (time_dis == len[destination] && short_time == vec[destination])
{
printf("Distance = %d; Time = %d: %d", time_dis, short_time,starting);
// -> 2 -> 5"
for (int i = 0; i < time_len; i++)
printf(" -> %d", timeway[i]);
printf("\n");
}
else
{
printf("Distance = %d: %d", len[destination], starting);
for (int i = 0; i < dlen; i++)
printf(" -> %d", disway[i]);
printf("\n"); printf("Time = %d: %d", vec[destination], starting);
for (int i = 0; i < time_len; i++)
printf(" -> %d", timeway[i]);
printf("\n");
} return 0;
}

PAT甲级1111. Online Map的更多相关文章

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

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

  2. PAT甲级1131. Subway Map

    PAT甲级1131. Subway Map 题意: 在大城市,地铁系统对访客总是看起来很复杂.给你一些感觉,下图显示了北京地铁的地图.现在你应该帮助人们掌握你的电脑技能!鉴于您的用户的起始位置,您的任 ...

  3. PAT甲级——A1131 Subway Map【30】

    In the big cities, the subway systems always look so complex to the visitors. To give you some sense ...

  4. PAT甲级1131 Subway Map【dfs】【输出方案】

    题目:https://pintia.cn/problem-sets/994805342720868352/problems/994805347523346432 题意: 告诉你一个地铁线路图,站点都是 ...

  5. PAT甲级——1131 Subway Map (30 分)

    可以转到我的CSDN查看同样的文章https://blog.csdn.net/weixin_44385565/article/details/89003683 1131 Subway Map (30  ...

  6. PAT甲级——A1111 Online Map【30】

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

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

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

  8. PAT 1111 Online Map[Dijkstra][dfs]

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

  9. PAT甲级题解(慢慢刷中)

    博主欢迎转载,但请给出本文链接,我尊重你,你尊重我,谢谢~http://www.cnblogs.com/chenxiwenruo/p/6102219.html特别不喜欢那些随便转载别人的原创文章又不给 ...

随机推荐

  1. jQuery学习(二) 自定义扩展函数

    jQuery函数调用写法很优雅,在项目开发过程中,有需要自定义函数经常被使用到,将这些函数放置到项目ExtTool.js中,为了编码方式的统一,也希望这些自定义函数与jQuery函数一致的调用方式.在 ...

  2. java基础75 xpth技术(网页知识)

    1.xpth技术 1.1.xpath的作用 主要用于快速获取所需的节点对象. list<Node> selectNodes("xpath");  查询多个节点对象    ...

  3. epoll测试实例

     C++ Code  12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849 ...

  4. more命令 less命令

    more命令是一个基于vi编辑器文本过滤器,它以全屏幕的方式按页显示文本文件的内容,支持vi中的关键字定位操作.more名单中内置了若干快捷键,常用的有H(获得帮助信息),Enter(向下翻滚一行), ...

  5. day10--异步IO\数据库\队列\缓存

    上节回顾: 线程  vs  进程 https://www.cnblogs.com/alex3714/articles/5230609.html https://www.cnblogs.com/alex ...

  6. spring boot配置文件中 spring.mvc.static-path-pattern 配置项

    spring boot项目中的静态资源文件存放在static文件下面,当通过浏览器访问这些静态文件时,发现必须要添加static作为前缀才能访问,折腾了一番后发现,这个前缀跟 spring.mvc.s ...

  7. 【LOJ】#2674. 「NOI2012」美食节

    题解 这道题的费用流如果朴素一点怎么建边呢 建出\(\sum_{i = 1}^{n} p^{i} M\)个点,第\(i\)个厨师的第\(j\)个点表示这个厨师倒数第\(j\)个做的是某道菜 这个点向汇 ...

  8. Kibana部署及配置(四)

    一.Kibana安装 Kibana 是为 Elasticsearch 设计的开源分析和可视化平台.你可以使用 Kibana 来搜索,查看存储在 Elasticsearch 索引中的数据并与之交互.你可 ...

  9. django视图函数中 应用装饰器

    from django.shortcuts import render, redirect, HttpResponse from .forms import LoginForm, Registrati ...

  10. Gitlab Issue Tracker and Wiki(二)

    一. 引用问题 1. 登陆 Gitlab服务器 2. 进入到super-git项目 3. 创建一个问题 4. 查看创建问题的号码,可以在下图找到. 5. 对代码进行提交去关闭这个问题,首先把项目在本机 ...