图的DFS

def DFS_graph(graph,v0):
    vnum = graph.vertex_num()
    visited = [0]*vnum;
    visited[v0]=1
    DFS_seq = [v0]
    st = SStack()
    st.push((0,graph.out_edges(v0))
    while not st.is_empty():
        i,edges = st.pop()
        if i<len(edges):
            v,e = edges[i]
            st.push((i+1,edges))
            if not visited[v]:
                DFS_seq.append(v) //如果是新的结点,则加载到seq序列中
                visited[v]=1
                st.push(0,graph.out_edges(v))
    return DFS_seq

摘自裘宗燕的python数据结构

使用堆栈避免递归。注意:栈里记录了访问邻接矩阵行,以及其列坐标

while循环里:

1. 弹 pop

2.记录当前行以及i, 如果该行没有到尽头,压入该行下一个;

3.访问当前行的i,如果没有访问过则压栈

即 弹;压;如果新,压

 

### 有向的深度优先搜索算法实现与解释 #### 1. 深度优先搜索 (DFS) 的基本概念 深度优先搜索(Depth First Search, DFS)是一种用于遍历或搜索树或的算法。它沿着树的深度遍历节点,尽可能深入地探索每一个分支[^2]。 对于有向而言,DFS 可以帮助发现中的连通分量、环路以及拓扑排序等问题。其核心思想是从某个顶点出发,访问与其相邻的所有未被访问过的顶点,并递归地对这些邻接点执行相同的操作。 --- #### 2. Python 实现有向DFS 算法 下面是一个基于邻接表表示的有向DFS 实现: ```python class Graph: def __init__(self, vertices): self.V = vertices # 节点数量 self.graph = [[] for _ in range(vertices)] # 邻接表 def add_edge(self, u, v): """ 添加边到有向 """ self.graph[u].append(v) def dfs_util(self, node, visited, result): """ 辅助函数:递归实现DFS """ visited[node] = True # 标记当前节点已访问 result.append(node) # 将当前节点加入结果列表 # 对于当前节点的所有邻居节点递归调用dfs_util for neighbor in self.graph[node]: if not visited[neighbor]: self.dfs_util(neighbor, visited, result) def depth_first_search(self, start_node): """ 主函数:从指定起点开始进行DFS """ visited = [False] * self.V # 初始化所有节点为未访问状态 result = [] # 存储DFS顺序的结果 # 如果起始节点有效,则启动DFS过程 if 0 <= start_node < self.V: self.dfs_util(start_node, visited, result) # 返回DFS遍历结果 return result # 测试代码 if __name__ == "__main__": g = Graph(6) # 创建一个具有6个节点的有向 g.add_edge(0, 1) g.add_edge(0, 2) g.add_edge(1, 3) g.add_edge(2, 4) g.add_edge(3, 5) print("DFS Traversal from vertex 0:", g.depth_first_search(0)) ``` 此代码定义了一个 `Graph` 类来存储有向的信息并实现了 DFS 方法。通过递归的方式依次访问每个节点及其子节点,直到无法继续为止[^1]。 --- #### 3. 关键点解析 - **初始化阶段** 使用布尔数组 `visited[]` 来记录哪些节点已经被访问过,防止重复访问造成死循环。 - **递归逻辑** 当前节点标记为已访问后,对其所有的邻接点逐一尝试访问。如果某邻接点尚未被访问,则对该点再次调用相同的递归方法。 - **时间复杂度** 假设有 \( V \) 个节点和 \( E \) 条边,在最坏情况下,每条边都会被检查一次,因此总的时间复杂度为 \( O(V + E) \)[^2]。 - **空间复杂度** 主要由栈的空间消耗决定,取决于的最大深度。在极端情况下可能达到 \( O(V) \)。 --- #### 4. 应用场景举例 - **网络爬虫** 在抓取网页链接的过程中,可以通过 DFS 按照一定路径逐步扩展页面范围[^3]。 - **迷宫求解** 利用 DFS 探索所有可行路线直至找到出口位置。 - **检测环路** 结合颜色标记机制判断是否存在回溯路径从而确认是否有环存在。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值