内容总结 自《啊哈!算法!》

作为一个都大二的了一个菜鸡,做题的时候DFS怎么可以不会呢!!!

作为一个都大二了的(!!!)菜鸡....《啊哈算法》这本书第四章的搜索,开始那里我就没看懂,就跑来看第五章了。结果这个理解起来方便一些....总结摘抄一下给远方的不知名网友and for myself。

以下语言有不严谨之处请多包涵,先理解重要。

深度搜索算法,就是对于一个图(图自己瞎画的  太丑)  如下图所示,给这些圆圈标号。

然后我们遍历的时候,是“优先深度” ,先从一条路走到黑走不动了再换条道继续一条路走到黑。即先从1开始,走到2,走到5. 然后走不动了就先回去,先回到2,发现还有6可以走,然后又走到6了。然后又走不动了。便回到2,但是2的所有支路已经都被访问过了,那就再往回走一个,走到1。 回到1以后,2这条道已经走完了,就走到3,再走到7,走不动了再回到3,3没有别的支路可以走了就再回到1,然后再走4

那么上图的访问顺序是(不算重复的顶点):1  2  5  6  3  7  4

如果一条道走完了,比如说从2走到5,走完了,就要回到上一个路口顶点2。从5到2的过程称为回溯。

那么如何存储一个图呢?我们用一个二维数组arr来存储:

如上两个图所示,二维数组中第i行第j列表示的就是顶点i到顶点j是否有边。1表示有边,空着的就是没有边(在编程时可以将其赋值为9999,画图太麻烦我就省去了) ,二维数组行和列相等的我赋值为0.

能看到,上面的这个图是关于主对角线对称的,这是因为这个图是个‘无向图’。也就是这个图的边没有方向,从1到2和从2到1是一样的,所以 arr[ 2 ] [ 1 ] = arr[ 1 ][ 2 ] = 1。

以下是代码实现:

其中,book[  ]  这个数组一开始全部赋初值为0,表示未被访问过。被访问赋值为1。

还有一个需要知道的小知识点,就是我的代码内又两个return,第一个return表示函数结束,第二个return表示返回上一个dfs()函数,这是递归函数的特殊用法。比如:现在是dfs(5),执行代码时遇到了代码中第二个return,然后就会返回上一个执行的dfs()函数,这就变成了dfs(2),这个过程就是回溯。

 void dfs(int cur)//cur是当前在的顶点的编号
{
printf("%d ",cur);//按顺序打印出遍历过的点
sum++;//sum是全局变量,初值为0。每访问一个点,sum++。
if(sum==n)
return ;//n为全局变量,是总共点的数量。若sum==n,便是点都访问完了,就退出函数。 for(int i=;i<=n;i++)//从1号点到n号点依次尝试,看看谁与cur点相连着
{
if(arr[cur][i]==&&book[i]==)//若这个点没有被访问过并且与cur相连
{
book[i]=;//把这个点标记为已访问
dfs(i);//递归,继续从这个点再继续深入遍历
}
}
return ;//当与cur相连的所有点都已被访问过了,就返回到上一个dfs()
}

完整代码如下:

 #include<iostream>
#include<cstdio>
using namespace std; int book[],sum,n,arr[][]; void dfs(int cur)//cur是当前在的顶点的编号
{
printf("%d ",cur);//按顺序打印出遍历过的点
sum++;//sum是全局变量,初值为0。每访问一个点,sum++。
if(sum==n)
return ;//n为全局变量,是总共点的数量。若sum==n,便是点都访问完了,就退出函数。 for(int i=;i<=n;i++)//从1号点到n号点依次尝试,看看谁与cur点相连着
{
if(arr[cur][i]==&&book[i]==)//若这个点没有被访问过并且与cur相连
{
book[i]=;//把这个点标记为已访问
dfs(i);//递归,继续从这个点再继续深入遍历
}
}
return ;//当与cur相连的所有点都已被访问过了,就返回到上一个dfs()
} int main()
{
sum=;
int m,a,b;
cin>>n>>m;//m表示有几条边 n表示有几个点
for(int i=;i<=n;i++){
for(int j=;j<=n;j++){
if(i==j)
arr[i][j]=;
else
arr[i][j]=;//把没有边相连的标记为999999
}
} //读入顶点之间的那些边
for(int i=;i<m;i++)
{
cin>>a>>b;
arr[a][b]=;
arr[b][a]=;//由于时无向图,所以两个都要标记。在前面我说过了
}
book[]=;//从1号顶点出发。标记1号顶点已经被访问
dfs(); getchar();getchar(); return ;
}

ok fine 那么简单图遍历就说完了  下次继续写

DFS搜索算法--(1)基础图遍历 绝对看!的!懂!的更多相关文章

  1. 图文详解两种算法:深度优先遍历(DFS)和广度优先遍历(BFS)

    参考网址:图文详解两种算法:深度优先遍历(DFS)和广度优先遍历(BFS) - 51CTO.COM 深度优先遍历(Depth First Search, 简称 DFS) 与广度优先遍历(Breath ...

  2. 【算法】变邻域搜索算法(Variable Neighborhood Search,VNS)超详细一看就懂的解析

    更多精彩尽在微信公众号[程序猿声] 变邻域搜索算法(Variable Neighborhood Search,VNS)一看就懂的解析 00 目录 局部搜索再次科普 变邻域搜索 造轮子写代码 01 局部 ...

  3. 一看就懂的ReactJs入门教程(精华版)

    一看就懂的ReactJs入门教程(精华版) 现在最热门的前端框架有AngularJS.React.Bootstrap等.自从接触了ReactJS,ReactJs的虚拟DOM(Virtual DOM)和 ...

  4. python中和生成器协程相关yield from之最详最强解释,一看就懂(二)

    一. 从列表中yield  语法形式:yield from <可迭代的对象实例> python中的列表是可迭代的, 如果想构造一个生成器逐一产生list中元素,按之前的yield语法,是在 ...

  5. 一看就懂的Android APP开发入门教程

    一看就懂的Android APP开发入门教程 作者: 字体:[增加 减小] 类型:转载   这篇文章主要介绍了Android APP开发入门教程,从SDK下载.开发环境搭建.代码编写.APP打包等步骤 ...

  6. mysql取出现在的时间戳和时间时间戳转成人类看得懂的时间

    mysql取出现在的时间戳和时间时间戳转成人类看得懂的时间,我们在mysql里面他封装了一个内置的时间戳转化的函数,比如我们现在的时间戳是:1458536709 ,"%Y-%m-%d&quo ...

  7. JavaScript一看就懂(2)闭包

    认识闭包之前需要先了解作用域,如果你对作用域还没有足够了解,请移步JavaScript一看就懂(1)作用域 什么是闭包? 我们可以先简单认为:一个函数a定义在另一个函数b里面,这个函数a就是闭包: f ...

  8. 小学生都看得懂的C语言入门(1): 基础/判别/循环

    c基础入门, 小学生也可以都看得懂!!!! 安装一个编译器, 这方面我不太懂, 安装了DEV-C++  ,体积不大,30M左右吧, 感觉挺好用,初学者够了. 介绍下DEV 的快键键: 恢复 Ctrl+ ...

  9. python中和生成器协程相关的yield from之最详最强解释,一看就懂(四)

    如果认真读过上文的朋友,应该已经明白了yield from实现的底层generator到caller的上传数据通道是什么了.本文重点讲yield from所实现的caller到coroutine的向下 ...

随机推荐

  1. FTP服务器安装配置

    1.安装:yum install vsftpd -y 2.修改配置文件:cd /etc/vsftpd/ cat vsftpd.conf | grep -Ev '^$|^#' listen_port= ...

  2. 灵魂拷问:Java如何获取数组和字符串的长度?length还是length()?

    限时 1 秒钟给出答案,来来来,听我口令:"Java 如何获取数组和字符串的长度?length 还是 length()?" 在逛 programcreek 的时候,我发现了上面这个 ...

  3. AcWing:146. 序列(小根堆 + 数学归纳 + 贪心)

    给定m个序列,每个包含n个非负整数. 现在我们可以从每个序列中选择一个数字以形成具有m个整数的序列. 很明显,我们一共可以得到nmnm个这种序列, 然后我们可以计算每个序列中的数字之和,并得到nmnm ...

  4. R-ets()

    前情需知 指数预测模型 指数模型是用来预测时序未来值的最常用模型.这类模型相对比较简单,但是实践证明它们的短期预测能力较好.不同指数模型建模时选用的因子可能不同.比如 单指数模型(simple/sin ...

  5. [CSP-S模拟测试]:那一天我们许下约定(DP+组合数学)

    题目传送门(内部题2) 输入格式 每个测试点有多组测试数据.对于每组数据,有一行共三个整数$N$,$D$,$M$含义如题.输入结束标识为$“0 0 0”$ (不含引号). 输出格式 对于每组数据,输出 ...

  6. flask-数据库 进阶

    1. 级联操作 Cascade意为“级联操作”,就是在操作一个对象的同时,对相关的对象也执行某些操作.我们通过一个Post模型和Comment模型来演示级联操作,分别表示文章(帖子)和评论,两者为一对 ...

  7. IDEA的小技巧:1.Java代码不被识别2.目录下创建的文件夹所显示样式不是文件夹,而是"包"图标样式的问题

    在Idea上面一个正常的代码结构是这个样子的,但是有的时候,比如说当我们直接在一个文件夹中随便的创建的时候就会出现一些问题,比如说想让某个地方为代码目录,某个地方为资源目录的时候,直接的创建目录是不成 ...

  8. 关于PHP内部类的一些总结学习

    前言: 这篇文章主要对一些可以进行反序列化的php内置类的分析总结(膜lemon师傅之前的总结),当然不是所有的php内置类在存在反序列化漏洞时都能够直接利用,有些类不一定能够进行反序列化,php中使 ...

  9. IP输出 之 ip_local_out

    概述 将要从本地发出的数据包,会在构造了ip头之后,调用ip_local_out函数,该函数设置数据包的总长度和校验和,然后经过netfilter的LOCAL_OUT钩子点进行检查过滤,如果通过,则调 ...

  10. 从输入url到页面加载完成都发生了什么

    https://zhuanlan.zhihu.com/p/23155051 参考 一个http请求的过程 简要介绍一下一个http请求的网络传输过程: DNS Lookup先获得URL对应的IP地址( ...