森森喜欢坐地铁。这个假期,他终于来到了传说中的地铁之城——魔都,打算好好过一把坐地铁的瘾!

魔都地铁的计价规则是:起步价 2 元,出发站与到达站的最短距离(即计费距离)每 K 公里增加 1 元车费。

例如取 K = 10,动安寺站离魔都绿桥站为 40 公里,则车费为 2 + 4 = 6 元。

为了获得最大的满足感,森森决定用以下的方式坐地铁:在某一站上车(不妨设为地铁站 A),则对于所有车费相同的到达站,森森只会在计费距离最远的站或线路末端站点出站,然后用森森美图 App 在站点外拍一张认证照,再按同样的方式前往下一个站点。

坐着坐着,森森突然好奇起来:在给定出发站的情况下(在出发时森森也会拍一张照),他的整个旅程中能够留下哪些站点的认证照?

地铁是铁路运输的一种形式,指在地下运行为主的城市轨道交通系统。一般来说,地铁由若干个站点组成,并有多条不同的线路双向行驶,可类比公交车,当两条或更多条线路经过同一个站点时,可进行换乘,更换自己所乘坐的线路。举例来说,魔都 1 号线和 2 号线都经过人民广场站,则乘坐 1 号线到达人民广场时就可以换乘到 2 号线前往 2 号线的各个站点。换乘不需出站(也拍不到认证照),因此森森乘坐地铁时换乘不受限制。

输入格式:

输入第一行是三个正整数 NM 和 K,表示魔都地铁有 N 个车站 (1 ≤ N ≤ 200),M 条线路 (1 ≤ M ≤ 1500),最短距离每超过 K 公里 (1 ≤ K ≤ 106),加 1 元车费。

接下来 M 行,每行由以下格式组成:

<站点1><空格><距离><空格><站点2><空格><距离><空格><站点3> ... <站点X-1><空格><距离><空格><站点X>

其中站点是一个 1 到 N 的编号;两个站点编号之间的距离指两个站在该线路上的距离。两站之间距离是一个不大于 106 的正整数。一条线路上的站点互不相同。

注意:两个站之间可能有多条直接连接的线路,且距离不一定相等。

再接下来有一个正整数 Q (1 ≤ Q ≤ 200),表示森森尝试从 Q 个站点出发。

最后有 Q 行,每行一个正整数 Xi**,表示森森尝试从编号为 **Xi 的站点出发。

输出格式:

对于森森每个尝试的站点,输出一行若干个整数,表示能够到达的站点编号。站点编号从小到大排序。

输入样例:

6 2 6
1 6 2 4 3 1 4
5 6 2 6 6
4
2
3
4
5

输出样例:

1 2 4 5 6
1 2 3 4 5 6
1 2 4 5 6
1 2 4 5 6

代码实现

#include <algorithm>
#include <cstdio>
#include <map>
#include <queue>
using namespace std;
const int maxn = 205;
const int INF = 0x3f3f3f3f;
int d[maxn][maxn];
int terminal[maxn], vis[maxn][maxn];
map<int, int> been[maxn];
int n, m, k;
int line[10000];int main() {
#ifdef LOCALfreopen("E:\\Cpp\\1.in", "r", stdin);
#endifscanf("%d%d%d", &n, &m, &k);for (int i = 1; i <= n; i++)for (int j = 1; j <= n; j++)d[i][j] = (i == j) ? 0 : INF;int u, v, len;int fare;char ch;while (m--) {int len = 0;while (scanf("%d", &u)) {line[len++] = u;ch = getchar();if (ch == '\n') {terminal[line[0]] = terminal[line[len - 1]] = 1;for (int i = 0; i != len - 1; i += 2) {u = line[i], v = line[i + 2];d[v][u] = d[u][v] = min(d[u][v], line[i + 1]);}break;}}}for (int k = 1; k <= n; k++) {for (int i = 1; i <= n; i++)for (int j = 1; j <= n; j++)d[i][j] = min(d[i][j], d[i][k] + d[k][j]);}for (int i = 1; i <= n; i++) {for (int j = 1; j <= n; j++) {if (i == j || d[i][j] == INF)continue;fare = 2 + d[i][j] / k;if (!been[i].count(fare) || been[i][fare] < d[i][j])been[i][fare] = d[i][j];}}int t, cur, first;queue<int> Q;scanf("%d", &t);while (t--) {first = 1;scanf("%d", &u);vis[u][u] = 1;Q.push(u);while (!Q.empty()) {cur = Q.front();Q.pop();for (int i = 1; i <= n; i++) {if (vis[u][i] || d[cur][i] == INF)continue;if (terminal[i]) {Q.push(i);vis[u][i] = 1;} else {fare = 2 + d[cur][i] / k;if (d[cur][i] == been[cur][fare]) {Q.push(i);vis[u][i] = 1;}}}}for (int i = 1; i <= n; i++) {if (vis[u][i]) {if (first) {printf("%d", i);first = 0;} elseprintf(" %d", i);}}printf("\n");}return 0;
}

PTA 7-3 地铁一日游 (30 分)相关推荐

  1. 【CCCC】L3-022 地铁一日游 (30分),floyd+大模拟

    problem L3-022 地铁一日游 (30分) 森森喜欢坐地铁.这个假期,他终于来到了传说中的地铁之城--魔都,打算好好过一把坐地铁的瘾! 魔都地铁的计价规则是:起步价 2 元,出发站与到达站的 ...

  2. L3-022 地铁一日游 (30 分)-PAT 团体程序设计天梯赛 GPLT

    森森喜欢坐地铁.这个假期,他终于来到了传说中的地铁之城--魔都,打算好好过一把坐地铁的瘾! 魔都地铁的计价规则是:起步价 2 元,出发站与到达站的最短距离(即计费距离)每 K 公里增加 1 元车费. ...

  3. PTA 公路村村通 (30 分)

    7-3 公路村村通 (30 分) 现有村落间道路的统计数据表中,列出了有可能建设成标准公路的若干条道路的成本,求使每个村落都有公路连通所需要的最低成本. 输入格式: 输入数据包括城镇数目正整数N(≤1 ...

  4. PTA 7-10 公路村村通 (30分)

    现有村落间道路的统计数据表中,列出了有可能建设成标准公路的若干条道路的成本,求使每个村落都有公路连通所需要的最低成本. 输入格式: 输入数据包括城镇数目正整数N(≤1000)和候选道路数目M(≤3N) ...

  5. 团体天梯 L3-022 地铁一日游 (30 分)(测试点分析 and 推荐测试样例)

    L3-022 地铁一日游 (30 分) 森森喜欢坐地铁.这个假期,他终于来到了传说中的地铁之城--魔都,打算好好过一把坐地铁的瘾! 魔都地铁的计价规则是:起步价 2 元,出发站与到达站的最短距离(即计 ...

  6. PAT甲级1131 Subway Map (30分):[C++题解]堆优化dijkstra、单源最短路、地铁地图、巧妙地建图套dijkstra模板!!

    文章目录 题目分析 题目链接 题目分析 原题: 来源:acwing 分析: 建图:所有能走到的点之间建立一条边,比如下面一条地铁线路有4站,它们是相通的,两两之间建一条边,边权是经过的站点数. 下面考 ...

  7. PTA L3-031 千手观音 (30 分)

    PTA L3-031 千手观音 (30 分) 人类喜欢用 10 进制,大概是因为人类有一双手 10 根手指用于计数.于是在千手观音的世界里,数字都是 10 000 进制的,因为每位观音有 1 000 ...

  8. PTA 直捣黄龙(30分)

    直捣黄龙 (30 分) 本题是一部战争大片 -- 你需要从己方大本营出发,一路攻城略地杀到敌方大本营.首先时间就是生命,所以你必须选择合适的路径,以最快的速度占领敌方大本营.当这样的路径不唯一时,要求 ...

  9. PTA 直捣黄龙 (30 分)

    7-13 直捣黄龙 (30 分) 本题是一部战争大片 -- 你需要从己方大本营出发,一路攻城略地杀到敌方大本营.首先时间就是生命,所以你必须选择合适的路径,以最快的速度占领敌方大本营.当这样的路径不唯 ...

最新文章

  1. python电脑配置要求-Python--获取电脑配置信息--设计代码
  2. Android文件操作中的openFileOutPut和openFileInput
  3. 写在前面,白话 Yaf 探秘与深入
  4. Warning: Attempt to present on whose view is not in模态跳转问题
  5. 阿里云RPA专有云产品文档集合
  6. http 和 https_HTTPS与HTTP区别
  7. repeated_Ruby中带有示例的Array.repeated_combination()方法
  8. 尚学堂java 答案解析 第四章
  9. java符号引用 直接引用_java虚拟机的符号引用和直接引用
  10. mysqlbinlog工具_mysqlbinlog命令详解 Part 5 通过位置和时间查看日志
  11. 一个优雅地探索相关性的新可视化方法
  12. 麦克纳姆轮平台的两种构型
  13. 通过银行卡号,识别相应的银行信息
  14. linux客户端 手机,WAPI客户端在Linux系统中的实现
  15. 网吧服务器系统ghost,深度网吧GHOST辅助工具
  16. 面向对象 (Oriented-Object)
  17. 零中频接收机频率转换图_德国Ramp;S罗德与施瓦茨EMI测试接收机ESR系列
  18. Windows11常用快捷键总结(包含触控板使用技巧)
  19. Vue运行项目常用命令
  20. 2022年正月初七复工通知

热门文章

  1. Asp.net Core基于MVC框架实现PostgreSQL操作
  2. SQL注入(SQL Injection)
  3. 如何获取 OSS AccessKeyId、AccessKeySecret
  4. php面试题2018
  5. php实现目录及目录文件下的遍历
  6. 【QGIS入门实战精品教程】14.1:QGIS如何加载各种在线地图?
  7. SQL函数获取一年中每个月的天数
  8. 一维数组和二维数组的区别_数组指针和指针数组的区别
  9. 计算机应用怎么拼写,计算机应用本科论文提纲格式范文 计算机应用本科论文提纲如何写...
  10. linux系统多网口聚合配置,Linux网卡聚合linux多网卡绑定聚合之bond模式的原理是什么...