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

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

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

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

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

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

输入格式:
输入第一行是三个正整数 N、M 和 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

分析:Ter[i]数组表示第i个节点是不是两端的站点,Station中存储站点i直接能留下认证照的站点,Ans中存储站点i最终能留下认证照的站点,Fur_Dis中存储每个花费下能到达的最远距离,由于所有票价都有一个2的基础,所以加布加都可以。刚开始将地图的信息输入至Edge中,并记录两侧端点的信息。由于相同的两个站点也可能有不同距离的路线,所以这里需要取最小值。然后用Floyd最短路算法求出两个站点之间最短的路线。然后再遍历出每个节点到达的所有距离需要多少花费,如果该花费是最小值,说明该站点可以拍照。最后再通过简单的dfs,找出一个站点能以其他可换乘的车站作为中转点,可以到达的所有站点~

#include <bits/stdc++.h>
using namespace std;
const int Mx = 1e9;
int N, M, K, Q, from, to, dis, Ter[201], Edge[201][201];
map<int, set<int>> Station;
map<int, set<int>> Ans;
void DFS(int Start, int Now) {for (auto it : Station[Now]) {if (Ans[Start].count(it)) continue;Ans[Start].insert(it);DFS(Start, it);}
}
int main() {for (int i = 1; i <= 200; i++)for (int j = 1; j <= 200; j++)Edge[i][j] = Mx;scanf("%d %d %d", &N, &M, &K);while (M--) {scanf("%d", &from);Ter[from] = 1;while (1) {scanf("%d %d", &dis, &to);Edge[from][to] = Edge[to][from] = min(Edge[from][to], dis);from = to;if (getchar() == '\n') break;}Ter[to] = 1;}for (int k = 1; k <= N; k++)for (int i = 1; i <= N; i++)for (int j = 1; j <= N; j++) if (i != j) Edge[i][j] = min(Edge[i][j], Edge[i][k] + Edge[k][j]);for (int i = 1; i <= N; i++) {map<int, int> Fur_Dis;Ans[i].insert(i);for (int j = 1; j <= N; j++) {if (Edge[i][j] != Mx) {if (Ter[j] == 1) Station[i].insert(j);if (Edge[i][j] > Fur_Dis[Edge[i][j] / K]) Fur_Dis[Edge[i][j] / K] = Edge[i][j];}}for (int j = 1; j <= N; j++)if (Edge[i][j] == Fur_Dis[Edge[i][j] / K]) Station[i].insert(j);}for (int i = 1; i <= N; i++) DFS(i, i);scanf("%d", &Q);while (Q--) {scanf("%d", &from);for (auto it : Ans[from]) printf("%d%c", it, (it != *Ans[from].rbegin()) ? ' ' : '\n');}return 0;
}
												

L3-022 地铁一日游 (30 分)-PAT 团体程序设计天梯赛 GPLT相关推荐

  1. L3-011 直捣黄龙 (30 分)-PAT 团体程序设计天梯赛 GPLT

    本题是一部战争大片 -- 你需要从己方大本营出发,一路攻城略地杀到敌方大本营.首先时间就是生命,所以你必须选择合适的路径,以最快的速度占领敌方大本营.当这样的路径不唯一时,要求选择可以沿途解放最多城镇 ...

  2. L3-017 森森快递 (30 分)-PAT 团体程序设计天梯赛 GPLT

    森森开了一家快递公司,叫森森快递.因为公司刚刚开张,所以业务路线很简单,可以认为是一条直线上的N个城市,这些城市从左到右依次从0到(N−1)编号.由于道路限制,第i号城市(i=0,⋯,N−2)与第(i ...

  3. L3-012 水果忍者 (30 分)-PAT 团体程序设计天梯赛 GPLT

    2010年风靡全球的"水果忍者"游戏,想必大家肯定都玩过吧?(没玩过也没关系啦~)在游戏当中,画面里会随机地弹射出一系列的水果与炸弹,玩家尽可能砍掉所有的水果而避免砍中炸弹,就可以 ...

  4. L3-021 神坛 (30 分)-PAT 团体程序设计天梯赛 GPLT

    在古老的迈瑞城,巍然屹立着 n 块神石.长老们商议,选取 3 块神石围成一个神坛.因为神坛的能量强度与它的面积成反比,因此神坛的面积越小越好.特殊地,如果有两块神石坐标相同,或者三块神石共线,神坛的面 ...

  5. L3-020 至多删三个字符 (30 分)-PAT 团体程序设计天梯赛 GPLT

    给定一个全部由小写英文字母组成的字符串,允许你至多删掉其中 3 个字符,结果可能有多少种不同的字符串? 输入格式: 输入在一行中给出全部由小写英文字母组成的.长度在区间 [4, 106] 内的字符串. ...

  6. L3-016 二叉搜索树的结构 (30 分)-PAT 团体程序设计天梯赛 GPLT

    二叉搜索树或者是一棵空树,或者是具有下列性质的二叉树: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值:若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值:它的左.右子树也分别 ...

  7. L3-009 长城 (30 分)-PAT 团体程序设计天梯赛 GPLT

    正如我们所知,中国古代长城的建造是为了抵御外敌入侵.在长城上,建造了许多烽火台.每个烽火台都监视着一个特定的地区范围.一旦某个地区有外敌入侵,值守在对应烽火台上的士兵就会将敌情通报给周围的烽火台,并迅 ...

  8. L3-006 迎风一刀斩 (30 分)-PAT 团体程序设计天梯赛 GPLT

    迎着一面矩形的大旗一刀斩下,如果你的刀够快的话,这笔直一刀可以切出两块多边形的残片.反过来说,如果有人拿着两块残片来吹牛,说这是自己迎风一刀斩落的,你能检查一下这是不是真的吗? 注意摆在你面前的两个多 ...

  9. L3-023 计算图 (30 分)--PAT 团体程序设计天梯赛 GPLT

    "计算图"(computational graph)是现代深度学习系统的基础执行引擎,提供了一种表示任意数学表达式的方法,例如用有向无环图表示的神经网络. 图中的节点表示基本操作或 ...

最新文章

  1. 全球十大AI领军人物
  2. Vivado综合报multi-driven nets的错误的解决方法
  3. java 打印三维数组_Java基础第三天_数组
  4. sqlite 数据量_向SQLite批量导入csv,txt数据
  5. 中国国民休闲状况调查(2020)
  6. poj 2387 Til the Cows Come Home dijkstra
  7. flume channel monitor实现源码分析
  8. plsql 存储过程 批量提交_新一代的键值存储 KVell SOSP 2019
  9. 原 python实现模糊匹配_使用python中的fuzzywuzzy库进行模糊匹配实例
  10. winxp---执行任务计划
  11. 传奇开服教程——legend/blue引擎替换和登陆器生成教程
  12. 安全知识竞赛答题小程序
  13. PS去掉图片上的文字
  14. 技术可行性与操作可行性的资料搜集与分析
  15. JDK官方下载(旧版本,以前老版本)
  16. 10G XFP万兆光模块全类型介绍
  17. gb2312简繁转换js兼容各种浏览器
  18. java程序 联机方法_Java实现Tank大战联机版
  19. 用aux口远程配置路由器
  20. Js的Generator函数(一)

热门文章

  1. 怎么用bat关闭远程协助计算机,Windows批处理请求远程协助
  2. Java学习系列(十九)Java面向对象之数据库编程
  3. android手势创建及识别
  4. Java在特定情境中使用的技巧
  5. 小程序成长之路(一)-- 第一个完整demo
  6. Banana PI 开源硬件项目启动
  7. 在Ubuntu下如何切换到超级用户
  8. 结对编程其实可以变变?
  9. 给开发者的9个安全建议:既能保护供应链安全,也不会拖慢开发进程
  10. 治理软件供应链安全要打“团体赛” 共同建立供应链安全体系