一.dfs初印象
dfs是一种常用于图和树的遍历算法,用于遍历所有节点。要想掌握好dfs前提得理解递归的思想。dfs可以理解为一条路走到黑,不行,就返回,接着往下走。
二.dfs模板
基本思路分析:个人觉得重点是找到递归重复的部分,即找到题目中重复需要执行的部分,然后是递归出口的判断;再然后进行回溯,剪枝,记忆化搜索等优化。
def dfs(depth):
#depth为当层第几重循环即深度
if depth==N:
#当到达边界是,即返回
return
#每重循环进行枚举选择,即dfs递归处
三.优化
3.1 回溯
回溯就是在搜索尝试过程中寻找问题的解,当发现不满足条件时,就回溯,尝试别的路径。
强调的是此路不通,另寻他路。先打标记,记录路径;然后下一层,回到上一层,清除标记
3.1.1回溯法求全排列
def dfs(depth):
#depth表示当前层数,即已选的个数
if depth==n:
#输出每次的全排列
print(path)
return
for i in range(1,n+1):
#已标记
if vis[i]:
continue
#未标记
vis[i]=1
path.append(i)
#递归下一层
dfs(depth+1)
#回溯
#修改标记
vis[i]=0
#将该数字弹出
path.pop(-1)
n=int(input())
#标记数组,1为标记,0为未标记
vis=[0]*(n+1)
#路径数组
path=[]
dfs(0)