这题在搞清楚思路绕过坑后,还是可以写的出通过sample data的代码的。但是不能AC,让我很气。

最后查清原因:还是对dfs本质理解的不够。

wa代码:

vis[s]=1;
dfs(s,e,0);

殊不知本题有多个查询数据。如果只调用一遍还可以蒙混过关,但是这样的错误必然导致wa

ac代码:

vis[s]=1;
dfs(s,e,0);
vis[s]=0;

参考柳诺博客修改的AC代码:

#include <stdio.h>
#include <memory.h>
#include <math.h>
#include <string>
#include <vector>
#include <set>
#include <stack>
#include <queue>
#include <algorithm>
#include <map> #define I scanf
#define OL puts
#define O printf
#define F(a,b,c) for(a=b;a<c;a++)
#define FF(a,b) for(a=0;a<b;a++)
#define FG(a,b) for(a=b-1;a>=0;a--)
#define LEN 10000
#define MAX 0x06FFFFFF
#define V vector<int> using namespace std; vector<int> g[LEN];
int line[LEN][LEN];
int vis[LEN];
vector<int> path;
vector<int> ans;
int min_d=MAX;
int min_ls=MAX; int N,M,K; int calc_ls(){
int cnt=-,preLine=;
for(int i=;i<path.size();i++){
if(line[path[i-]][path[i]]!=preLine) cnt++;
preLine=line[path[i-]][path[i]];
}
return cnt;
} void dfs(int s,int e,int d){
if(s==e){
int ls=calc_ls();
if(d<min_d || (d==min_d && ls<min_ls)){
min_d=d;
min_ls=ls;
ans=path;
}
return;
}
int i;
FF(i,g[s].size()){
int o=g[s][i];
if(!vis[o]){
vis[o]=;
path.push_back(o);
dfs(o,e,d+);
vis[o]=;
path.pop_back();
}
} } void printLine(){
int s=ans[];
int preL=;
int i;
F(i,,ans.size()){
if(line[ans[i-]][ans[i]]!=preL){
if(preL) printf("Take Line#%d from %04d to %04d.\n",preL,s,ans[i-]);
s=ans[i-];
preL=line[ans[i-]][ans[i]];
}
}
printf("Take Line#%d from %04d to %04d.\n",preL,s,ans[i-]);
} int main(){
// freopen("1131.txt","r",stdin);
int s,e,i,j;
I("%d",&N);
F(i,,N+){
int pre,p=-;
I("%d",&M);
while(M--){
pre=p;
I("%d",&p);
if(pre>=){
g[p].push_back(pre);
g[pre].push_back(p);
line[p][pre]=i;
line[pre][p]=i;
}
}
}
I("%d",&K);
while(K--){
min_d=MAX;
min_ls=MAX;
path.clear();
ans.clear();
I("%d%d",&s,&e);
path.push_back(s);
vis[s]=;
dfs(s,e,);
vis[s]=;
O("%d\n",min_d);
printLine();
}
return ;
}

在自己思路上修改的AC代码:(个人认为比柳诺的好理解)

 #include <stdio.h>
#include <memory.h>
#include <math.h>
#include <string>
#include <vector>
#include <set>
#include <stack>
#include <queue>
#include <algorithm>
#include <map> #define I scanf
#define OL puts
#define O printf
#define F(a,b,c) for(a=b;a<c;a++)
#define FF(a,b) for(a=0;a<b;a++)
#define FG(a,b) for(a=b-1;a>=0;a--)
#define LEN 10000
#define MAX 0x06FFFFFF
#define V vector<int> using namespace std; vector<int> g[LEN];
int line[LEN][LEN];
int vis[LEN];
vector<int> path;
vector<int> ans;
int min_d=MAX;
int min_ls=MAX; int N,M,K; void dfs(int s,int e,int d,int l,int ls){
if(s==e){
if(d<min_d || (d==min_d && ls<min_ls)){
min_d=d;
min_ls=ls;
ans=path;
}
return;
}
int i;
FF(i,g[s].size()){
int o=g[s][i];
if(!vis[o]){
vis[o]=;
path.push_back(o);
int nl=line[s][o];
int nls=ls;
if(l==){ //初始结点
nls=;
}else{
if(nl!=l) nls++;
}
dfs(o,e,d+,nl,nls);
vis[o]=;
path.pop_back();
}
} } void printLine(){
int s=ans[];
int preL=line[s][ans[]];
int i;
F(i,,ans.size()){
if(line[ans[i-]][ans[i]]!=preL){
printf("Take Line#%d from %04d to %04d.\n",preL,s,ans[i-]);
s=ans[i-];
preL=line[ans[i-]][ans[i]];
}
}
printf("Take Line#%d from %04d to %04d.\n",preL,s,ans[i-]);
} int main(){
// freopen("1131.txt","r",stdin);
int s,e,i,j;
I("%d",&N);
F(i,,N+){
int pre,p=-;
I("%d",&M);
while(M--){
pre=p;
I("%d",&p);
if(pre>=){
g[p].push_back(pre);
g[pre].push_back(p);
line[p][pre]=i;
line[pre][p]=i;
}
}
}
I("%d",&K);
while(K--){
min_d=MAX;
min_ls=MAX;
path.clear();
ans.clear();
I("%d%d",&s,&e);
vis[s]=;
dfs(s,e,,,);
vis[s]=;
O("%d\n",ans.size());
ans.insert(ans.begin(),s);
printLine();
}
return ;
}

注意点:

① 38 39 行,对维护的最小距离和最小换乘次数进行更新,不要写错(我开始写成了d=min_d ,查了很久的错,蠢哭……)

② 99 100 行,将最小距离和最小换乘次数重新初始化为INF。

③ 106 行,牢记 dfs 结构

图的遍历 | 1131地铁图: dfs复杂模拟题的更多相关文章

  1. 图的遍历(bfs 和dfs)

    BFS的思想: 从一个图的某一个顶点V0出发,首先访问和V0相邻的且未被访问过的顶点V1.V2.……Vn,然后依次访问与V1.V2……Vn相邻且未被访问的顶点.如此继续,找到所要找的顶点或者遍历完整个 ...

  2. 图的遍历 之 深搜dfs

    DFS 遍历 深度优先搜索是一个递归过程,有回退过程. 对一个无向连通图,在访问图中某一起始顶点u 后,由u 出发,访问它的某一邻接顶点v1:再从v1 出发,访问与v1 邻接但还没有访问过的顶点v2: ...

  3. PAT Advanced 1034 Head of a Gang (30) [图的遍历,BFS,DFS,并查集]

    题目 One way that the police finds the head of a gang is to check people's phone calls. If there is a ...

  4. PAT Advanced 1076 Forwards on Weibo (30) [图的遍历,BFS,DFS]

    题目 Weibo is known as the Chinese version of Twitter. One user on Weibo may have many followers, and ...

  5. 洛谷P3916||图的遍历||反向建图||链式前向星||dfs

    题目描述 给出 NN 个点, MM 条边的有向图,对于每个点 vv ,求 A(v)A(v) 表示从点 vv 出发,能到达的编号最大的点. 解题思路 看起来很简单的一道题, 但我依然调了一天,我还是太菜 ...

  6. Luogu P3916 图的遍历 【优雅的dfs】【内有待填坑】By cellur925

    说明 • 对于60% 的数据, n,m在1e3内 • 对于100% 的数据, n,m在1e5内. 本弱弱上来就是一顿暴搜打,dfs n次,每次更新答案,复杂度为O(n*n),果然TLE,60分抱回家. ...

  7. 图的遍历(搜索)算法(深度优先算法DFS和广度优先算法BFS)

    图的遍历的定义: 从图的某个顶点出发访问遍图中所有顶点,且每个顶点仅被访问一次.(连通图与非连通图) 深度优先遍历(DFS): 1.访问指定的起始顶点: 2.若当前访问的顶点的邻接顶点有未被访问的,则 ...

  8. 图的遍历——DFS(矩形空间)

    首先,这里的图不是指的我们一般所说的图结构,而是大小为M*N的矩形区域(也可以看成是一个矩阵).而关于矩形区域的遍历问题经常出现,如“寻找矩阵中的路径”.“找到矩形区域的某个特殊点”等等之类的题目,在 ...

  9. 图的遍历——DFS和BFS模板(一般的图)

    关于图的遍历,通常有深度优先搜索(DFS)和广度优先搜索(BFS),本文结合一般的图结构(邻接矩阵和邻接表),给出两种遍历算法的模板 1.深度优先搜索(DFS) #include<iostrea ...

随机推荐

  1. c语言课本及pta作业中运用到的程序思维

    c语言课本运用到的程序思维 我个人觉得在写程序的时候,有很多题目会用到我们学过的解决一个程序或者一个问题的方法,把这些方法运用起来,将会使自己更加灵活地解决诸多问题,为今后打下良好地基础. (因为还没 ...

  2. Rabbit MQ 学习参考

    网上的教程虽然多,但是提供demo的比较少,或者没有详细的说明,因此,本人就照着网上的教程做了几个demo,并把代码托管在码云,供有需要的参考. 项目地址:https://gitee.com/dhcl ...

  3. idea gradle项目导入

    然后要选择正确的gradle版本: 每个开源项目的gradle版本,这个很重要.因为每一个gradle版本都不同.

  4. springboot: xercesImpl.jar和xml-apis.jar (系统找不到指定的文件)

    springboot内置的tomcat为8.5.23, tomcat在8.5.2 中 修改了加载jar的方式,8.5.2 版本会解析jar中MANIFEST.MF文件,当该文件包含class-path ...

  5. 百度前端技术学院task1.10

    任务十:Flexbox 布局练习 面向人群: 有一定HTML及CSS基础的同学 难度: 中 重要说明 百度前端技术学院的课程任务是由百度前端工程师专为对前端不同掌握程度的同学设计.我们尽力保证课程内容 ...

  6. js、jscore与webkit、nodejs的关系

    js:编程语言 jscore:js语言的解释执行引擎,代表cpu: webkit.nodejs:js语言的运行平台,代表操作系统.计算机资源.

  7. 安卓访问https错误,访问http可以,可能是nginx ssl证书配置有问题

    开发中遇到react-native生成的android访问UAT和开发环境的http api都可以,但是访问生产环境的https就报错,还有就是第三方webhook调用你https网站的api也可能会 ...

  8. fancybit个人简介

    程序员一枚 熟悉C C++ C# js lua等多种常见开发语言 熟悉Unity游戏开发 node.js pomelo和C# scut 网游后端框架 做过.net和php网站后端 二次元文化爱好者 有 ...

  9. WebAPI HelpPage帮助页

    WebAPI HelpPage是个插件,根据代码的注释生成API说明页,一目了然. 下面开始安装和配置 1.添加引用 先选择管理NuGet程序包,搜索 Microsoft.AspNet.WebApi. ...

  10. PIE SDK 多数据源的复合数据集加载

    1. 功能简介 GIS遥感图像数据复合是将多种遥感图像数据融合成一种新的图像数据的技术,是目前遥感应用分析的前沿,PIESDK通过复合数据技术可以将多幅幅影像数据集(多光谱和全色数据)组合成一幅多波段 ...