PAT A1131 Subway Map
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的更多相关文章
- PAT甲级——A1131 Subway Map【30】
In the big cities, the subway systems always look so complex to the visitors. To give you some sense ...
- A1131. Subway Map (30)
In the big cities, the subway systems always look so complex to the visitors. To give you some sense ...
- PAT 1131 Subway Map
In the big cities, the subway systems always look so complex to the visitors. To give you some sense ...
- PAT 1131. Subway Map (30)
最短路. 记录一下到某个点,最后是哪辆车乘到的最短距离.换乘次数以及从哪个位置推过来的,可以开$map$记录一下. #include<map> #include<set> #i ...
- PAT_A1131#Subway Map
Source: PAT A1131 Subway Map (30 分) Description: In the big cities, the subway systems always look s ...
- PAT甲级1131. Subway Map
PAT甲级1131. Subway Map 题意: 在大城市,地铁系统对访客总是看起来很复杂.给你一些感觉,下图显示了北京地铁的地图.现在你应该帮助人们掌握你的电脑技能!鉴于您的用户的起始位置,您的任 ...
- PAT甲级——1131 Subway Map (30 分)
可以转到我的CSDN查看同样的文章https://blog.csdn.net/weixin_44385565/article/details/89003683 1131 Subway Map (30 ...
- PAT甲级1131 Subway Map【dfs】【输出方案】
题目:https://pintia.cn/problem-sets/994805342720868352/problems/994805347523346432 题意: 告诉你一个地铁线路图,站点都是 ...
- 1131 Subway Map DFS解法 BFS回溯!
In the big cities, the subway systems always look so complex to the visitors. To give you some sense ...
随机推荐
- VUE常用写法
v-for: v-for ='item,key of data' v-for ='item,index in data' @click='' @click='pop.show=false' ...
- Sass&Scss入门 选择器 混合器 导入 条件判断 迭代
Sass 基于ruby的一种将脚本解析成CSS的脚本语言.也可以说是一种预处理语言. Sass在css的语法基础上增加了变量.嵌套.混合.继承.导入等高级功能. 使用Sass与Sass样式库(如com ...
- Codeforces Round #624 (Div. 3) F
题意: 给出n的质点,带着初位置和速度: 如果中途两点可以相遇dis(i,j)=0: 如果不可以相遇,mindis(i,j): 求n个点的两两质点最小dis(i,j)之和 思路: 因为当初位置x和速度 ...
- CSS学习(6)层叠
1.声明冲突 不同的样式,多次应用到同一元素 层叠:解决声明冲突的过程,浏览器自动处理(权重计算) 有时候需要修改样式的时候,可以使用优先级高的方式覆盖,而不是在源代码修改 ①比较重要性 (1)作者样 ...
- 每天进步一点点------DE2-70-TV例子说明
module Reset_Delay(iCLK,iRST,oRST_0,oRST_1,oRST_2); input iCLK; input iRST; output reg oRST_0; outpu ...
- type和object详解
python中的type和object详解 关于这篇博客 这篇博客主要描述Python的新风格对象(new-style objects),如下: <type 'type'>和<t ...
- Robot Framework高级
一.Web自动化测试 二.C/S自动化测试 三.数据库自动化测试 四.接口自动化测试 五.RF内置测试库 六.持续集成内置测试库 七.移动自动化测试 八.自定义RF
- mysql之mysql的安装
此次MySQL安装的版本为:MySQL8.0 系统为:centos6.9 64位 一.利用yum仓库安装 wget https://repo.mysql.com//mysql80-community- ...
- 疯狂python(分享本不错的书)
网盘链接:https://pan.baidu.com/s/1JDawVe8CT9BsHav5gBZS6Q 提取码vg8k
- jQuery中$("input")与$(":input")的区别
$("input")表示获取页面所有的input元素 $(":input")选取表单中所有的input,select 和 button元素