You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python邻接矩阵DFS无法遍历到E节点问题排查及步骤打印需求

问题排查:DFS无法到达E节点的原因

原代码执行流程分析

按照你的代码逻辑,E节点实际上是可以被访问到的,遍历顺序为 A→B→D→C→E。你可能没注意到最后一步的输出,因为E是最后被访问的节点。

不过代码存在两个容易造成误解的问题:

  • 访问状态打印时机错误:代码先打印vis和un_vis,再将当前节点加入已访问列表,导致每次打印的状态不包含当前正在处理的节点。比如初始调用时,打印的visited是空列表,但此时正在处理A节点,容易让你误以为节点未被访问。
  • 字符串查找的低效判断:用mapping[neigh] in un_vis判断邻居是否未访问,需要遍历字符串列表,虽然不影响功能,但效率较低。

修复后的代码

调整打印时机,确保打印状态包含当前处理的节点,同时优化判断逻辑:

def dfs(node, vis, un_vis, adj, mapping):
    # 先更新访问状态,再打印
    vis.append(mapping[node])
    un_vis.remove(mapping[node])
    print("visited -> ", vis)
    print("unvisited -> ", un_vis)
    print()
    
    for neigh in range(len(adj[0])):
        if adj[node][neigh] == 1 and mapping[neigh] in un_vis:
            dfs(neigh, vis, un_vis, adj, mapping)

adj = [[0,1,1,1,0],
       [1,0,0,1,1],
       [1,0,0,1,0],
       [1,1,1,1,1],
       [0,1,0,1,0]]
vis = []
un_vis = ['A','B','C','D','E']
starting_node = 0
mapping = {0:'A',1:'B',2:'C',3:'D',4:'E'}
dfs(starting_node, vis, un_vis, adj, mapping)

修复后输出示例

visited ->  ['A']
unvisited ->  ['B', 'C', 'D', 'E']

visited ->  ['A', 'B']
unvisited ->  ['C', 'D', 'E']

visited ->  ['A', 'B', 'D']
unvisited ->  ['C', 'E']

visited ->  ['A', 'B', 'D', 'C']
unvisited ->  ['E']

visited ->  ['A', 'B', 'D', 'C', 'E']
unvisited ->  []

从输出可以清晰看到E节点被正常访问的完整过程。

内容的提问来源于stack exchange,提问作者Aadhar Jain

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 00:44:52