1.深度优先搜索
深度优先搜索(DFS,Deep First Search)是一种用于遍历或搜索树或图的算法。这个算法会尽可能深地搜索树的分支。当节点v的所在边都已被探寻过,搜索将回溯到发现节点v的那条边的起始节点。这一过程一直进行到已发现从源节点可达的所有节点为止。如果还存在未被发现的节点,则选择其中一个作为源节点并重复以上过程,整个进程反复进行直到所有节点都被访问为止。
深度优先搜索属于盲目搜索,它并不考虑目标在哪里,只是按照一种既定的策略进行搜索,直到找到目标或者遍历完整个图。DFS常用的策略是先沿着一条路径搜索到底,然后再回溯到上一个节点,继续搜索下一条路径,直到所有的路径都搜索完。
在图的遍历中,深度优先搜索的策略可以简单地描述为:访问一个顶点,然后递归地访问与此顶点相邻的未被访问过的所有顶点。在树中,由于不存在环路,所以这种搜索策略是有效的。但是,在图中,由于存在环路,所以必须注意避免重复访问已经访问过的顶点。为此,通常使用一个布尔数组或者哈希表来标记已经访问过的顶点。
深度优先搜索在图论和计算机科学中有着广泛的应用,例如解决图的连通性问题、寻找图中的路径、生成图的拓扑排序等。此外,深度优先搜索也是很多其他复杂算法的基础,如回溯法、动态规划等。
2.深度优先搜索(DFS)在列举全排列时,可以采用递归的方式进行。
- 确定递归函数:定义一个递归函数,比如
dfs(arr, visited, output, index)
,其中arr
是待排列的数组,visited
是一个布尔数组用于标记元素是否被访问过,output
是当前已经排列好的部分结果,index
是当前要填充的位置。 - 递归终止条件:当
index
等于排列的长度时,说明已经找到了一个完整的排列,可以将output
输出或保存起来。 - 遍历所有可能:在每一步中,遍历数组
arr
,对于每一个未被访问过的元素,将其标记为已访问,并将其添加到output
的当前位置,然后递归调用dfs
函数填充下一个位置。 - 回溯:在递归返回后,需要将当前位置的元素从
output
中移除,并将其标记为未访问,以便在后续的遍历中可以再次选择该元素。
3.深度优先搜索(DFS)列举全排列
#include<iostream>
#include<string.h>
#define MAX 10
using namespace std;
int a[MAX+1],book[MAX+1],n;
void dfs(int step){
if (step==n+1)
{
for (int i = 1; i <=n; i++)cout<<a[i]<<" ";
putchar(10);
return;
}
for (int i = 1; i <=n; i++)//每个盒子尝试顺序
{
if (book[i]==0)
{
a[step]=i;//放入盒子的数字
book[i]=1;//标记该数字已使用
dfs(step+1);//下一个盒子
book[i]=0;//标记该数字已取回
}
}
return;
}
int main(){
cin>>n;
dfs(1);
return 0;
}