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,提问作者Ангелина Єфремова
相关产品推荐
相关产品推荐

