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

NetworkX绘制DFS生成树时边(5,4)未上色 如何修改edge_colors段

问题根因

nx.dfs_tree() 返回的是有向图(DiGraph)类型的生成树,存储的边是带方向的有序元组。如果原始图G是无向图,其边是无序存储的——当遍历G.edges拿到的边元组节点顺序和DFS生成树中存储的顺序相反时(比如G中边存为(4,5),生成树中对应边存为(5,4)),直接用e in st.edges做成员判断会匹配失败,导致对应边无法被正确染成红色。

修复方法

消除边的方向对匹配逻辑的影响,有两种简单实现:

  • 方法1:将DFS生成树直接转为无向图后再做边匹配,代码最简洁
  • 方法2:将边转为无序结构(frozenset)后再做集合匹配,兼容性更强

修正后的代码

推荐直接用转无向图的方案,修改量最小:

spanning_tree = nx.dfs_tree(G)
tree_edges = spanning_tree.edges()
print("\nspanning tree:", tree_edges)

# 将有向的生成树转为无向图,消除边的节点顺序影响
st = spanning_tree.to_undirected()
edge_colors = ['red' if e in st.edges else 'black' for e in G.edges]
nx.draw(G, pos=my_layout, with_labels=True, edge_color=edge_colors, edgecolors='black', node_color="white", font_weight='bold')
plt.show()

如果不想修改生成树的类型,可以用无序结构匹配的写法:

st = spanning_tree
# 构建顺序不敏感的生成树边集合
st_edge_set = {frozenset(edge) for edge in st.edges()}
edge_colors = ['red' if frozenset(e) in st_edge_set else 'black' for e in G.edges]

补充:如果原始图G本身是有向图,不需要做上述无向转换,漏上色问题仅出现在无向原始图搭配有向DFS生成树的场景中。

内容的提问来源于stack exchange,提问作者Ангелина Єфремова

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.03 04:31:04