深度优先搜索
深度优先搜索也叫DFS。是一种常见的图搜索(遍历)方法。该方法秉承着不到黄河心不死的思路对图中个点进行遍历搜索。
思想:
先沿着一条路遍历(查询)直到这条路不能走的时候,我们再回退到可以走位置继续遍历(查询)
方法(不给详细代码给思路,具体问题有增减很正常):
首先我们遍历的是一个图。G(V,E),G代表该图,V是点的集合,E是边的集合。
1.递归的:
函数1:
1.建立一个数组保存所有点的状况。(是否被遍历过)
2.建立一个数组保存每个点遍历的顺序(就是一个int数组记录第一个点是第几个被遍历的,或者hashMap用点名和他的顺序一一对应)。
3.建立代表初始编号的变量并初始化为1(2,3步如果不在乎顺序可以不用操作)
4.遍历每个点,如果该点没有被访问过,就对该点调用函数2(你可能会想肯定都没有访问过啊,但是在调用函数2时会访问部分后续的节点)
函数2:
1.标记调用点已访问(记录在状态数组中)
2.记录该点的为第几个遍历的,然后使记录顺序的变量加1(结合函数1看是否需要)
3.如果该点是查询的点输出信息并停止(遍历就无视这步)
4.对该点的所有未被访问(就是你没有在状态数组中标记的)的邻接点调用函数2
2.非递归的我们使用栈来储存只用一个函数就可以了
函数3:
1.建立一个栈来储存点
2.同样需要状态数组
3.记录编号的数组同上
4.初始编号为1(3,4依然随情况决定要还是不要)
2.将第一个点压入栈中(没有要求就随意取一个点)
3.当栈不为空时循环做以下的操作(缩进表示循环)
4.将栈首元素出栈,如果要查询就检查该点与需要查询的点是否一致,一致就停止。不需要的话就只出栈。
5.将该点标记为已访问,记录其编号。
6.将其所有的没有访问的邻接点压入栈中。
时间复杂度;
1.使用临接矩阵O(n^2),因为在寻找临接点这步操作的时候临接矩阵会查看所有的点
2.使用临接表O(n+e)因为所有定点的临接点之和就相当于两倍的边。n+2e属于O(n+e)