深度优先搜索
定义
DFS 全称是 Depth First Search,中文名是深度优先搜索,是一种用于遍历或搜索树或图的算法。所谓深度优先,就是说每次都尝试向更深的节点走。
特点
该类搜索算法的特点在于,将要搜索的目标分成若干「层」,每层基于前几层的状态进行决策,直到达到目标状态。
过程
DFS 最显著的特征在于其递归调用自身。同时与BFS类似,DFS会对其访问过的点打上访问标记,在遍历图时跳过已打过标记的点,以确保每个点仅访问一次。符合以上两条规则的函数,便是广义上的DFS。
性质
该算法通常的时间复杂度为O(n+m),空间复杂度为O(n),其中n表示点数,m表示边数。注意空间复杂度包含了栈空间,栈空间的空间复杂度是O(n)的。在平均O(1)遍历一条边的条件下才能达到此时间复杂度,例如用前向星或邻接表存储图;如果用邻接矩阵则不一定能达到此复杂度。
模板
普通排列
#include <bits/stdc++.h>
using namespace std;
int n,m,a[1000000+5];
bool flag[1000000+5];
void dfs(int t){
//
if(t