DFS入门

本文详细介绍了深度优先搜索(DFS)的基本框架与应用,包括如何确定参数、实现全排列,以及通过实例讲解如何使用DFS解决具体问题。文章提供了核心代码示例,并附有多个链接供进一步学习。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

核心代码:

关于dfs参数问题,什么在变化,就把什么设置成参数。

DFS基本框架

void dfs()//参数用来表示状态  
{  
    if(到达终点状态)  
    {  
        ...//根据题意添加  
        return;  
    }  
    if(越界或者是不合法状态)  
        return;  
    if(特殊状态)//剪枝
        return ;
    for(扩展方式)  
    {  
        if(扩展方式所达到状态合法)  
        {  
            修改操作;//根据题意来添加  
            标记;  
            dfs();  
            (还原标记);  
            //是否还原标记根据题意  
            //如果加上(还原标记)就是 回溯法  
        }  
 
    }  
}  

DFS全排列

 

 

 

https://blog.youkuaiyun.com/Coding_Or_Dead/article/details/52326519

https://blog.youkuaiyun.com/qq_40763929/article/details/81629800

https://blog.youkuaiyun.com/u014355480/article/details/47126977

https://blog.youkuaiyun.com/zjh_2017/article/details/79517072

https://blog.youkuaiyun.com/m0_37690319/article/details/81396629?utm_source=blogxgwz4

https://blog.youkuaiyun.com/banana_cjb/article/details/80334127

以下是深度优先搜索(DFS)的入门级代码示例,基于常见的应用场景——遍历图结构: ### 图的 DFS 遍历实现 假设有一个无向图表示如下邻接表形式的数据结构 `graph`,可以使用以下 Python 实现来完成 DFS 遍历。 ```python def dfs(graph, start_node, visited=None): if visited is None: visited = set() # 创建一个集合用于记录已访问过的节点 visited.add(start_node) # 将当前节点标记为已访问 print(start_node, end=" ") # 输出当前节点 (可以根据需求修改操作) for neighbor in graph[start_node]: # 遍历当前节点的所有邻居节点 if neighbor not in visited: # 如果邻居节点未被访问过,则递归调用 dfs(graph, neighbor, visited) # 测试数据:定义一个简单的无向图 graph_example = { 0: [1, 2], 1: [0, 3, 4], 2: [0, 5], 3: [1], 4: [1], 5: [2] } print("DFS Traversal starting from node 0:") dfs(graph_example, 0) # 调用函数并指定起始节点为 0 ``` 此代码实现了从给定起点出发的深度优先遍历,并打印经过的节点顺序。对于测试数据中的例子,输出应类似于[^1]: ``` DFS Traversal starting from node 0: 0 1 3 4 2 5 ``` 需要注意的是,在某些情况下可能需要调整具体逻辑以适应不同的问题场景,比如当遇到更复杂的约束条件或者特定目标时。 --- 另外一种常见情况是对树形结构执行 DFS 来解决问题,例如生成所有子集或排列组合等问题。下面提供了一个简单版本的例子用来展示如何通过递归来构建所有的子集列表[^3]: ### 使用 DFS 构建数组的所有子集 ```python def subsets(nums): result = [] def backtrack(temp_list, index): result.append(list(temp_list)) # 添加当前状态下的临时结果 for i in range(index, len(nums)): # 对于剩余部分尝试加入新的元素 temp_list.append(nums[i]) # 做选择 backtrack(temp_list, i + 1) # 进入下一层决策树 temp_list.pop() # 撤销上一步的选择 backtrack([], 0) return result nums_test = [1, 2, 3] all_subsets = subsets(nums_test) for subset in all_subsets: print(subset) ``` 该程序会依次枚举 `[1, 2, 3]` 数组里的每一个可能子集,最终得到的结果将是完整的幂集表现形式。 --- ####
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值