python实现dfs全套系列(思路+模版+优化+典型例题)

本文介绍深度优先算法(DFS),它常用于图和树的遍历,需理解递归思想。给出DFS模板,强调找到递归重复部分和递归出口。还介绍了回溯、剪枝、记忆化搜索等优化方法,并通过全排列、n皇后问题、军训排队等实例说明。

一.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)

3.1.2回溯法解决n皇后问题

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值