题目

题意: 找出一条路线,使得对任何给定的起点和终点,可以找出中途经停站最少的路线;如果经停站一样多,则取需要换乘线路次数最少的路线

tip:DFS + map

分析:0.可以这样计算出一条线路的换乘次数:在line[10000][10000]的数组中保存每两个相邻站中间的线路是几号线~从头到尾遍历最终保存的路径,preLine为前一小段的线路编号,如果当前的结点和前一个结点组成的这条路的线路编号和preLine不同,说明有一个换乘,就将cnt+1,最后遍历完累加的cnt即是换乘的次数~1.可以这样计算出一条线路中途停站的次数:在dfs的时候有个变量cnt,表示当前路线是所需乘的第几个站,每次dfs时候将cnt+1表示向下遍历一层~cnt就是当前中途停站的次数~2.可以这样输出结果:和计算线路换乘次数的思路一样,每当preLine和当前Line值不同的时候就输出一句话~保存preTransfer表示上一个换乘站,最后不要忘记输出preTransfer和最后一个站之间的路即使最后一个站并不是换乘站

#include<iostream>
#include<vector>
#include<cstring>
#include<unordered_map>
using namespace std;
vector<int> s[10003];
int checked[10003]= {0};
int mincnt,mintransfer,ed;
unordered_map<int,int>line;
vector<int>path,temp;
int getcnt(vector<int> a) {//计算换乘数int cnt=-1,preline=0;for(int i=1; i<a.size(); ++i) {if(line[a[i-1]*10000+a[i]]!=preline)cnt++;preline=line[a[i-1]*10000+a[i]];}return cnt;
}
void dfs(int start,int cnt) {temp.push_back(start);checked[start]=1;if(cnt>mincnt)return ;if(start==ed) {if(cnt==mincnt) {//站数相同比较换乘数if(getcnt(temp)<mintransfer) {path=temp;mintransfer=getcnt(temp);}} else  {path=temp;mincnt=cnt;mintransfer=getcnt(temp);}return ;}for(auto i : s[start]) {if(checked[i]==0) {dfs(i,cnt+1);temp.pop_back();checked[i]=0;}}
}
int main() {int n;cin>>n;for(int i=0; i<n; ++i) {int m,prestation,tempstation;cin>>m>>prestation;for(int j=1; j<m; ++j) {cin>>tempstation;s[prestation].push_back(tempstation);s[tempstation].push_back(prestation);line[prestation*10000+tempstation]=line[tempstation*10000+prestation]=i+1;//每记录两个站之间的地铁号prestation=tempstation;}}int k;cin>>k;for(int i=0; i<k; ++i) {int a;cin>>a>>ed;mincnt=1e7;mintransfer=1e7;memset(checked,0,sizeof(checked));temp.clear();dfs(a,0);cout<<mincnt<<endl;int preline=0,pretransfer=a;for(int j=1; j<path.size(); ++j) {if(line[path[j-1]*10000+path[j]]!=preline) {//与前一站地铁号不同就得换乘if(preline)printf("Take Line#%d from %04d to %04d.\n", preline, pretransfer, path[j-1]);preline = line[path[j-1]*10000+path[j]];pretransfer = path[j-1];}}printf("Take Line#%d from %04d to %04d.\n", preline, pretransfer, ed);}return 0;
}

1131 Subway Map相关推荐

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

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

  2. PAT 1131. Subway Map (30) DFS

    1131. Subway Map (30) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue In the big ...

  3. 1131. Subway Map (30)-PAT甲级真题 (DFS or 堆优化dij or SPFA)

    题意 给出地铁线路数n,分别给出每条线的站点数m,再依次列出站点id.然后询问k次从启点sv到终点ev的最短路径,如果最短路径相同,要求换乘最少的路径.最后按条件输出. 思路 1.用unordered ...

  4. 1131 Subway Map (30分)/最短路径问题

    题目描述 In the big cities, the subway systems always look so complex to the visitors. To give you some ...

  5. PAT甲级 1131 - Subway Map

    Each station interval belongs to a unique subway line.这句话比较重要,所以在进行dfs的时候记录区间,会方便很多. #include<bit ...

  6. 1131 Subway Map (30 分)

    做不出来,一开始打算和Online map一样,用邻接表的dij做,但是发现这个交叉站点不好表示(用了二维数组存但不理想,超时超限). 没想到10e5竟然能用dfs做. 本题细节: 1.关于两站位于的 ...

  7. 1131. Subway Map 引用

    参考了这位大神的思路.http://blog.csdn.net/bendaai/article/details/63253277 注释了下代码,方便看了.PS:这个题想了好久好久好久好久..感觉自己太 ...

  8. 1131 Subway Map (30 分)【难度: 难 / Dijkstra最短路】

    https://pintia.cn/problem-sets/994805342720868352/problems/994805347523346432 一会儿补题

  9. 【PAT甲级】1131 Subway Map

    ✍个人博客:https://blog.csdn.net/Newin2020?spm=1011.2415.3001.5343

最新文章

  1. [唐诗]入朝洛堤步月-上官仪
  2. linux systemd-logind 进程cpu占用100% 解决方法
  3. Yii2中你可能忽略但很有用的两个方法batcheach
  4. 中石油训练赛 - Check List(线段树维护偏序问题)
  5. matlab 柱状图_MATLAB作图实例:24:条形图
  6. 关于SQL语句中的双引号、单引号和
  7. 【转】你真的懂select Socket模型吗?
  8. 工作4-5年的.NET开发人员也需要有人带带才可以保证软件项目的质量
  9. Neo4j 语法帮助文档
  10. 【Web_接口爬虫_Python3_百度一下_requestjsonetree】百度一下,检索“成都”,爬取标题、内容、链接地址,保存文本_20200301
  11. Jump视频实时抠图和语音降噪
  12. Compose 实现页面侧滑返回
  13. unity 刷新layout_【Unity源码学习】Layout
  14. CVPR 2021 | “以音动人”:姿态可控的语音驱动说话人脸
  15. xbox蓝牙手柄驱动_如何通过蓝牙将Xbox One控制器连接到Windows
  16. 单片机笔记十一:华大单片机
  17. 程序员的发展之路一(转)
  18. 创业期间,应该怎么样坚持下去?如何从容面对困难?
  19. 玄武密码(bzoj4327)(JSOI2012)
  20. codevs 2832 6个朋友 并查集 解题报告

热门文章

  1. BIST(build_in selftest)介绍
  2. matlab中文乱码问题
  3. 动漫头发基础画法,正面动漫头发画法
  4. GD32 SPI DMA收发
  5. Unity 游戏性能优化(4)资源优化
  6. 当我去了不到 20 人的 IT 公司后。。。
  7. 根据当前日期求取当年是否为闰年,当天是周几。
  8. 数学建模(数据分析C题)-建模思路
  9. linux学习笔记,简单的粗暴使用教学
  10. 马蜂窝定制游抢单系统设计与功能核心