思路:DFS遍历

  1. #include <iostream>
  2. #include <map>
  3. #include <vector>
  4. #include <cstdio>
  5. using namespace std;
  6.  
  7. const int INF = 0x7fffffff;
  8. const int maxn = ;
  9.  
  10. struct Node{
  11. int line, s, e;
  12. Node(int xl, int xs, int xe) :line(xl), s(xs), e(xe) {}
  13. };
  14.  
  15. struct WhichLine {
  16. int u, v;
  17. WhichLine(int _u, int _v) :u(_u), v(_v) {}
  18. friend bool operator <(WhichLine a,WhichLine b) {//const whichLine &a, const whichLine &b
                                     //如果只是whichLine &a, whichLine &b报错
  19. if (a.u != b.u) return a.u < b.u;
  20. else return a.v < b.v;
  21. }
  22. };
  23. map<WhichLine, int> searchLine;//判断两个站点在哪条线上
  24. vector<int> G[maxn];//图的邻接表
  25. bool visit[maxn];//判断是否已经访问数组
  26. int minStation, minTransfer;//最少的站点,最少的换乘
  27. vector<Node> ans, temp;//最终结果路径和中间记录路径
  28. int st, ed;
  29.  
  30. void DFS(int head, int now, int stationCnt, int pre) {
  31. if (now == ed) {
  32. if (stationCnt < minStation || stationCnt == minStation && temp.size() < minTransfer) {
  33. minStation = stationCnt;
  34. minTransfer = temp.size();
  35. ans = temp;
  36. ans.push_back(Node(searchLine[WhichLine(pre, now)], head, now));
  37. return;
  38. }
  39. }
  40.  
  41. visit[now] = true;
  42. for (auto next : G[now]) {
  43. if (visit[next]) continue;
  44. if (pre != now && searchLine[WhichLine(pre, now)] != searchLine[WhichLine(now, next)]) {
  45.  
  46. temp.push_back(Node(searchLine[WhichLine(pre, now)], head, now));
  47. DFS(now, next, stationCnt + , now);
  48. temp.pop_back();
  49. }
  50. else DFS(head, next, stationCnt + , now);
  51. }
  52.  
  53. visit[now] = false;
  54. }
  55.  
  56. int main(){
  57. int n;
  58. scanf("%d", &n);
  59. for (int i = ; i <= n; ++i){
  60. int k, u, v;
  61. scanf("%d", &k);
  62. for (int j = ; j < k; j++) {
  63. scanf("%d", &v);
  64. if (j > ) {
  65. searchLine[WhichLine(u, v)] = i;//两个相邻节点的线路
  66. searchLine[WhichLine(v, u)] = i;
  67. G[u].push_back(v);
  68. G[v].push_back(u);
  69. }
  70. u = v;
  71. }
  72. }
  73. int q;
  74. scanf("%d", &q);
  75. while (q--){
  76. scanf("%d %d", &st, &ed);
  77. minStation = minTransfer = INF;
  78. DFS(st, st, , st);
  79. printf("%d\n", minStation);
  80. for (auto x : ans) printf("Take Line#%d from %04d to %04d.\n", x.line, x.s, x.e);
  81. }
  82. return ;
  83. }

1131(★、※)Subway Map的更多相关文章

  1. Java集合(十)实现Map接口的HashMap

    Java集合(十)继承Map接口的HashMap 一.HashMap简介(基于JDK1.8) HashMap是基于哈希表(散列表),实现Map接口的双列集合,数据结构是“链表散列”,也就是数组+链表 ...

  2. .NET Core中间件的注册和管道的构建(3) ---- 使用Map/MapWhen扩展方法

    .NET Core中间件的注册和管道的构建(3) ---- 使用Map/MapWhen扩展方法 0x00 为什么需要Map(MapWhen)扩展 如果业务逻辑比较简单的话,一条主管道就够了,确实用不到 ...

  3. [SoapUI] Post请求Body里面限制特殊字符(&、%),Groovy脚本里特殊字符需要添加“\”转义($)。

    SoapUI的Post请求,在body里面不能包含(&.%),如果含有这些特殊字符,请求会报错:在添加的Groovy脚本里有些特殊字符需要使用“\”转义($),不然也会报错.

  4. 从头认识java-15.1 填充容器(3)-填充Map

    这一章节我们来讨论一下填充容器的还有一个方面Map.之前的两个章节我们都是用list来作为容器.这一章节我们使用Map. 还有在这里解释一下为什么一直都使用生成器这个东西,事实上他就是建造者设计模式, ...

  5. Javase之集合体系(4)之Map集合

    集合体系之Map集合 ##Map<K,V>( 接口 ) 特点:将键映射到值对象,一个映射不能包含重复的键:每个键只能映射一个值 Map集合与Collection集合的区别 ​ Map集合存 ...

  6. 【Go入门教程2】内置基础类型(Boolean、数值、字符串、错误类型),分组,iota枚举,array(数值),slice(切片),map(字典),make/new操作,零值

    这小节我们将要介绍如何定义变量.常量.Go内置类型以及Go程序设计中的一些技巧. 定义变量 Go语言里面定义变量有多种方式. 使用var关键字是Go最基本的定义变量方式,与C语言不同的是Go把变量类型 ...

  7. 【Android】RxJava的使用(三)转换——map、flatMap

    前两篇Android RxJava的使用(一)基本用法.Android RxJava的使用(二)Action介绍了RxJava的基本用法,对Rxjava还不了解的请先看以上两篇.这篇为大家讲解RxJa ...

  8. 【Go入门教程4】变量(var),常量(const),内置基础类型(Boolean、数值 byte,int,rune、字符串、错误类型),分组,iota枚举,array(数值),slice(切片),map(字典),make/new操作,零值

    这小节我们将要介绍如何定义变量.常量.Go 内置类型以及 Go 程序设计中的一些技巧. 定义变量 Go 语言里面定义变量有多种方式. 使用 var 关键字是 Go 最基本的定义变量方式,与 C 语言不 ...

  9. (转)百度Map API

    转自  http://blog.sina.com.cn/s/blog_6079f38301013sb3.html 一.与地图操作相关的接口哦! (这些接口的开启都是写在执行成功的回调函数那里) map ...

随机推荐

  1. 网络(socket)编程

    一.网络协议 客户端/服务器架构 1.硬件C/S架构(打印机) 2.软件C/S架构(互联网中处处是C/S架构):B/S架构也是C/S架构的一种,B/S是浏览器/服务器 C/S架构与socket的关系: ...

  2. noip模拟ernd

    [题目背景]解决了第一题之后,你打开了第二题.这是一道关于树的题目,你很快想出了一个复杂度和树的直径有关的算法,可以通过所有的数据.不过,你的做法常数似乎有点大.为了更好地卡常,你决定构造一些数据来检 ...

  3. 使用VMware新建一个Linux系统虚拟机(全)

    我们将其分为两步,1:新建虚拟机:2:安装Red Hat Enterprse Linux 6操作系统 1.首先我们新建一个虚拟机,先不安装操作系统,稍后再对其安装Linux系统. 新建虚拟机步骤如下: ...

  4. Python—全局变量、局部变量、匿名函数

    局部变量和全局变量 college1 = 'JMU' #全局变量 def change_name(name): college1 = 'LiGong' #局部变量,此函数是其作用域 # global ...

  5. js获取html元素在可视区域的位置

    1)html节点在可视区域的位置 obj.getBoundingClientRect().top obj.getBoundingClientRect().left 2) 获取鼠标按下的位置 event ...

  6. Go used as value问题

    练习Go变参时遇到一个报错:used as value 代码如下: // 错误代码 func myfunc(arg ...int) { for _, n := range arg { fmt.Prin ...

  7. བྱ་དེ་ཁྲུང་ཁྲུང་དཀར་པོ།།--洁白的仙鹤/仓央嘉措情歌--IPA--藏语

    <<洁白的仙鹤>>, 也就是大家熟悉的仓央嘉措情歌之一.

  8. 基于Verilog的简单FIFO读写实验

    一.模块框图及基本思路 fifo_ip:ISE生成的IP fifo_control:在fifo未满情况下不断写入递增的四位数,每隔1s读出一个数据驱动Led显示 fifo_top:前两个模块的组合 二 ...

  9. Windows10 64位安装TensorFlow-GPU

    TensorFlow有GPU版和CPU版. GPU版需要CUDA和cuDNN支持,到链接:https://developer.nvidia.com/cuda-gpus 确认自己的显卡是否支持CUDA. ...

  10. iOS动画学习

    学习一下动画,感谢以下大神的文章:    UIView:基础动画.关键帧动画.转场动画 Core Animation :基础动画,关键帧动画,动画组,转场动画,逐帧动画 CALayer :CALaye ...