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. ORACLE_BASE、ORACLE_HOME有什么区别

    ORACLE_BASE.ORACLE_HOME有什么区别   ORACLE_BASE下是admin和productORACLE_HOME下则是ORACLE的命令.连接库.安装助手.listener等等 ...

  2. 利用ZotFile对Zotero中的文献进行整理

    1.安装ZotFile插件 *** 以后补充 *** 2.配置ZotFile 配置 3.整理操作 (1)将文件拖进Zotero软件相应的目录(自己创建) (2)查看文件位置 (未整理之前) (3)整理 ...

  3. idea项目更改git地址

    第一步:idea打开项目,菜单栏找VCS - Git - Remotes 点进去,弹出对话框,选中,点击编辑 弹出编辑框,更改地址,点击ok 弹出输入账号密码编辑框,输入自己的账号密码,点击确认 完成 ...

  4. zabbix监控服务部署脚本

    搭建平台脚本: #!/bin/bash #zabbix监控服务部署 #脚本使用前提:yum搭建,nginx-1.12.2源码包,zabbix-3.4.4源码包,要求源码包尽量在单一目录下,最好在默认管 ...

  5. PP Bottle Have High Cycle Times

    This year, the participation of 0.1% -0.4% sorbitol nucleating agent in general PP can produce high- ...

  6. Foreach报错

    List<String> a = new ArrayList<String>(); 2 a.add("1"); 3 a.add("2") ...

  7. 消息队列(五)--- RocketMQ-消息存储2

    概述 RocketMQ存储中主要用到以下知识点: mmap 文件映射 内存池 异步刷盘 consumeQueue 同时本节将介绍各个重要的类,本篇文章将介绍 mmap 文件映射的相关方法和内存池相关知 ...

  8. 【译】高级T-SQL进阶系列 (四)【上篇】:使用游标进行行级别处理

    [译注:此文为翻译,由于本人水平所限,疏漏在所难免,欢迎探讨指正] 原文链接:传送门. 正常来说,使用游标并不是处理记录集的最佳方式.然而当一个经验丰富的程序员第一次开始写TSQL时,他们经常会寻找其 ...

  9. Shiro入门学习之散列算法与凭证配置(六)

    一.散列算法概述 散列算法一般用于生成数据的摘要信息,是一种不可逆的算法,一般适合存储密码之类的数据,常见的散列算法如MD5.SHA等,一般进行散列时最好提供一个salt(“盐”),什么意思?举个栗子 ...

  10. 《JavaScript高级程序设计》读书笔记(三)基本概念第六小节理解函数

    内容---语法---数据类型---流程控制语句 上一小节---理解函数 本小节 函数--使用function关键字声明,后跟一组参数以及函数体 function functionName(arg0, ...