dfs,选择最优路径并输出~

这道题难度非常炸裂,要求完完整整自己推一遍,DFS才算过关!
思路:一遍dfs,过程中要维护两个变量,minCnt 中途停靠最少的站。minTransfer需要换成的最少次数
1 可以这样算出一条线路的换乘次数:在line数组里保存每两个相邻站中间的线路是几号线,从头到尾遍历最终保存的路径,preLine为前一小段线路编号,如果当前的节点和前一个节点组成的这条路的编号和preLine不同,说明有一个换乘,就将cnt+1,最后遍历完累加的cnt即是换乘的次数。
2 line数组的存储,用二维数组会内存超限,我们用unordered_map<int,int> line存储的方式,第一个int用来存储线路,每次将前四位存储在第一个线路,后四位存储在第二个线路,第二个int用来保存相邻的线路是几号线。
3 可以这样算出一条线路中途停站的次数,在dfs的时候有个变量cnt,表示当前路线是所需乘的第几个站,每次dfs的时候将cnt加一表示向下遍历一层,cnt就是当前中途停站的次数。
2 可以这样输出结果:和计算线路换乘次数思路一样,每当preLine和当前line值不同的时候就输出一句话,保存perTransfer表示上一个换乘站,最后不要忘记输出pretransfer和最后一个站之间的路,即使最后一个站不是换乘站。

#include<bits/stdc++.h>
using namespace std;
const int maxn=;
unordered_map<int,int> line;
vector<int> g[maxn];
vector<int> path,tmp;
bool visit[maxn]={false};
int minCnt=1e9;
int minTransferCnt=1e9;
int st,ed;
int transfer (vector<int> v) {
int cnt=,preLine=;
for (int i=;i<v.size();i++)
if (line[v[i-]*+v[i]]!=preLine) {
cnt++;
preLine=line[v[i-]*+v[i]];
}
return cnt;
}
void dfs (int v) {
visit[v]=true;
tmp.push_back(v);
if (v==ed) {
int transferCnt=transfer(tmp);
if (tmp.size()<minCnt) {
minCnt=tmp.size();
minTransferCnt=transferCnt;
path=tmp;
}
else if (tmp.size()==minCnt&&transferCnt<minTransferCnt) {
minTransferCnt=transferCnt;
path=tmp;
}
visit[v]=false;
tmp.pop_back();
return;
}
for (int i=;i<g[v].size();i++) {
if (visit[g[v][i]]==false) {
dfs (g[v][i]);
}
}
visit[v]=false;
tmp.pop_back();
}
int main () {
int N;
scanf ("%d",&N);
int k,pre,x;
for (int i=;i<=N;i++) {
scanf ("%d %d",&k,&pre);
for (int j=;j<k;j++) {
scanf ("%d",&x);
g[pre].push_back(x);
g[x].push_back(pre);
line[pre*+x]=line[x*+pre]=i;
pre=x;
}
}
int q;
scanf ("%d",&q);
for (int i=;i<q;i++) {
scanf ("%d %d",&st,&ed);
fill (visit,visit+maxn,false);
minTransferCnt=1e9;
minCnt=1e9;
tmp.clear();
dfs (st);
printf ("%d\n",path.size()-);
int preLine=line[path[]*+path[]];
int pre=;
for (int j=;j<path.size();j++) {
if (line[path[j]*+path[j+]]!=preLine) {
printf ("Take Line#%d from %04d to %04d.\n",preLine,path[pre],path[j]);
pre=j;
preLine=line[path[j]*+path[j+]];
}
}
}
return ;
}

PAT A1131 Subway Map的更多相关文章

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

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

  2. A1131. Subway Map (30)

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

  3. PAT 1131 Subway Map

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

  4. PAT 1131. Subway Map (30)

    最短路. 记录一下到某个点,最后是哪辆车乘到的最短距离.换乘次数以及从哪个位置推过来的,可以开$map$记录一下. #include<map> #include<set> #i ...

  5. PAT_A1131#Subway Map

    Source: PAT A1131 Subway Map (30 分) Description: In the big cities, the subway systems always look s ...

  6. PAT甲级1131. Subway Map

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

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

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

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

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

  9. 1131 Subway Map DFS解法 BFS回溯!

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

随机推荐

  1. vue+axios安装

    Axios是一个基于promise的HTTP库,可以用在浏览器和node.js中. 安装方式: 1.使用cdn <script src="https://unpkg.com/axios ...

  2. Python整合pdf【新手必学】

    在下载课件时往往会分成很多个小的pdf,一个也就几页,想要整合成一整个大pdf,于是百度了一下,网上有很多在线的pdf整合器,但是由于这蛋疼的网速,流量还要花钱,还是想要本地搞. 说python是万能 ...

  3. js 设计模式:观察者和发布订阅模式

    总是把这两个当作同一个模式,但其实是不太一样的,现在重温一下. 观察者模式 观察者直接订阅目标,当目标触发事件时,通知观察者进行更新 简单实现 class Observer { constructor ...

  4. AI人工智能之基于OpenCV+face_recognition实现人脸识别

    因近期公司项目需求,需要从监控视频里识别出人脸信息.OpenCV非常庞大,其中官方提供的人脸模型分类器也可以满足基本的人脸识别,当然我们也可以训练自己的人脸模型数据,但是从精确度和专业程度上讲Open ...

  5. Java 倒入文章显示前n个单词频率

    package com_1; import java.io.FileNotFoundException; import java.io.FileReader; import java.io.IOExc ...

  6. Presto入门介绍

    (一)背景 MapReduce不能满足大数据快速实时adhoc查询计算的性能要求,Facebook2012年开发,2013年开源 (二)是什么 基于内存的并行计算,Facebook推出的分布式SQL交 ...

  7. Java进阶学习(1)之类与对象(上)

    package com.study; //自动售卖机 public class vmachine { private int price = 80; private int balance; priv ...

  8. 【转】直播流程,视频推流,视频拉流,简介,SMTP、RTMP、HLS、 PLPlayerKit

    原:https://www.cnblogs.com/baitongtong/p/11248966.html 1 .音视频处理的一般流程: 数据采集→数据编码→数据传输(流媒体服务器) →解码数据→播放 ...

  9. 「NOIP2018」赛道修建

    传送门 Luogu 解题思路 一眼先二分(上界树的直径,下界最小边权),然后再考虑 \(\text{DP}\). 对于当前节点 \(u\),在它的所有儿子中分别返回一条匹配不完的长度最大的路径 \(M ...

  10. 如何使用canvas绘制椭圆,扩展非chrome浏览器中的ellipse方法

    这篇博文主要针对浏览器中绘制椭圆的方法扩展.在网上搜索了很多,发现他们绘制椭圆的方式都有缺陷.其中有压缩法,计算法,贝塞尔曲线法等多种方式.但是都不能很好的绘制出椭圆.所有我就对这个绘制椭圆的方式进行 ...