题目:https://pintia.cn/problem-sets/994805342720868352/problems/994805347523346432

题意:

告诉你一个地铁线路图,站点都是用四位数来编号。

现在问你从某一起点到某一终点,经过站数最少的乘车方式是什么?要输出方案。

如果站数相同要输出换乘较少的。

思路:

首先肯定是搜索没有问题了。因为要输出方案,所以bfs不太方便存答案。很容易想到用dfs

比较麻烦的是输出方案的时候,线路相同的那些站都合并在同一个线路里了。那么我们就再维护一个乘车区间结构体。

如果当前走的边和当前答案最后一条边是同一个线路,就把答案中最后一个乘车区间的终点改为当前的点。

回溯的时候不仅要把vis数组恢复,还要把答案恢复成dfs之前的,所以用一个tmpans来记录一下本次dfs之前的答案。

 #include<cstdio>
#include<cstdlib>
#include<map>
#include<set>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<vector>
#include<cmath>
#include<stack>
#include<queue> #define inf 0x7fffffff
using namespace std;
typedef long long LL;
typedef pair<string, string> pr; struct station{
int to;
int line;
station(){
}
station(int _to, int _line){
to = _to;
line = _line;
}
}; struct mapnode{
vector<station>list;
}; struct segment{
int st, ed;
int line;
segment(){}
segment(int _st, int _ed, int _line)
{
st = _st;
ed = _ed;
line = _line;
}
}; struct Ans{
int len;
vector<segment>anslist; bool operator < (const Ans b)const{
if(len == b.len)
return anslist.size() < b.anslist.size();
return len < b.len;
}
}; const int maxn = 1e5 + ;
mapnode sta[maxn];
int n, k; Ans ans, nowans;
bool vis[maxn];
void dfs(int st, int ed)
{
if(st == ed){
if(nowans < ans)ans = nowans;
//return;
} if(ans < nowans)return; for(int i = ; i < sta[st].list.size(); i++){
int to = sta[st].list[i].to;
if(!vis[to]){
Ans tmpans = nowans;
nowans.len++;
if(sta[st].list[i].line == nowans.anslist.back().line){
nowans.anslist.back().ed = to;
}
else{
nowans.anslist.push_back(segment(st, to,sta[st].list[i].line));
} vis[to] = true;
dfs(to, ed);
vis[to] = false;
nowans = tmpans;
}
}
} void init()
{
memset(vis, , sizeof(vis));
nowans.anslist.clear();
nowans.len = ;
nowans.anslist.push_back(segment(-, -, -));
ans.anslist.clear();
ans.len = inf; } int main()
{
scanf("%d", &n);
for(int i = ; i <= n; i++){
int m;
scanf("%d", &m);
int prev;
scanf("%d", &prev);
for(int j = ; j < m; j++){
int to;
scanf("%d", &to);
sta[prev].list.push_back(station(to, i));
sta[to].list.push_back(station(prev, i));
prev = to;
}
} scanf("%d", &k);
while(k--){
int st, ed;
scanf("%d%d", &st, &ed);
init();
dfs(st, ed);
printf("%d\n", ans.len);
for(int i = ; i < ans.anslist.size(); i++){
printf("Take Line#%d from %04d to %04d.\n", ans.anslist[i].line, ans.anslist[i].st, ans.anslist[i].ed);
}
} return ;
}

PAT甲级1131 Subway Map【dfs】【输出方案】的更多相关文章

  1. PAT甲级1131. Subway Map

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

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

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

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

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

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

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

  5. PAT甲级1111. Online Map

    PAT甲级1111. Online Map 题意: 输入我们当前的位置和目的地,一个在线地图可以推荐几条路径.现在你的工作是向你的用户推荐两条路径:一条是最短的,另一条是最快的.确保任何请求存在路径. ...

  6. PAT 1131 Subway Map

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

  7. PAT 1131. Subway Map (30)

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

  8. 1131 Subway Map(30 分)

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

  9. 1131 Subway Map

    题意:给出起点和终点,计算求出最短路径(最短路径即所经过的站点最少的),若最短路径不唯一,则选择其中换乘次数最少的一条线路. 思路:本题虽然也是求最短路径,但是此路径是不带权值的,路径长度即所经过的边 ...

随机推荐

  1. 在Linux平台上搭建EasyDarwin,编译代码并简单部署

    測试环境: Ubuntu gcc / g++ 从https://github.com/EasyDarwin/EasyDarwin下载代码 1.编译 第一步:进入源码文件夹下 cd ./EasyDarw ...

  2. 【java】求两个字符串的最长公共子串

    这个是华为OJ上的一道题目.首先,如果我们用java写代码,华为OJ有以下三条规则需遵守,否则编译无法通过或者用例无法通过,规则如下: (1)一定不可以有包名: (2)主类名只能为Main: (3)不 ...

  3. [Aaronyang紫色博客] 写给自己的WPF4.5-Blend5公开课系列 1

     我的文章一定要做到对读者负责,否则就是失败的文章  ---------   www.ayjs.net    aaronyang技术分享 欢迎大家支持我的力作<[Aaronyang] 写给自己的 ...

  4. Oracle之外键(Foreign Key)使用方法具体解释(二)- 级联删除(DELETE CASCADE)

    Oracle外键(Foreign Key)之级联删除(DELETE CASCADE) 目标 演示样例解说怎样在Oracle外键中使用级联删除 什么是级联删除(DELETE CASCADE)? 级联删除 ...

  5. Linux说明书 - man浅谈

    原文链接: http://www.cnblogs.com/xuxn/archive/2011/08/26/linux-manual-man-command.html 所有学过Linux的同学都应该知道 ...

  6. JS 日期转换,格式化等常用的函数定义

    //判断字符串是否日期格式 function isDate(val) { return new Date(val) != "Invalid Date"; } //日期格式化 fun ...

  7. 申请IPV6地址配置IPV6域名

    0. 前言 最近弄了一下IPV6,虽然不知道什么时候会用到,但是服务器支持IPV6,还是有必要的. 1. 申请IPV6地址 https://tunnelbroker.net/ 到这个网址去注册一个帐号 ...

  8. 【30集iCore3_ADP出厂源代码(ARM部分)讲解视频】30-7底层驱动之滴嗒定时器

    视频简介:该视频介绍iCore3应用开发平台中的配置方法,以及在应用开发平台中的应用. 源视频包下载地址:链接:http://pan.baidu.com/s/1o7UuUwi 密码:14cx 银杏科技 ...

  9. Java知多少(51)finally

    当异常被抛出,通常方法的执行将作一个陡峭的非线性的转向.依赖于方法是怎样编码的,异常甚至可以导致方法过早返回.这在一些方法中是一个问题.例如,如果一个方法打开一个文件项并关闭,然后退出,你不希望关闭文 ...

  10. Oracle中Select语句完整的执行顺序

    oracle Select语句完整的执行顺序: .from 子句组装来自不同数据源的数据: .where 子句基于指定的条件对记录行进行筛选: .group by子句将数据划分为多个分组: .使用聚集 ...