NetworkX使用add_edges_from()添加单向边的实现方法及问题解决
解决方法
核心问题修正
你当前遇到的边方向被反转、无法区分单向/双向边的根本原因是:你使用了无向图类nx.Graph(),无向图会自动忽略边的方向,把(u,v)和(v,u)视为同一条边,直接覆盖属性。你只需要把图实例替换为有向图类nx.DiGraph(),即可严格保留边的方向和独立容量属性。
适配后的完整代码
你原有的边列表已经完全符合你的需求:
- 要求的单向边RIC->MAR、VB->RIC、VB->WDC,列表中仅存在正向定义,无反向边
- 要求的双向边(RIC-NCA、NCA-VB)列表中同时包含正反两条边,且各自设置了不同容量
直接替换图类即可正常运行:
import networkx as nx # 仅需把nx.Graph()改为nx.DiGraph(),边列表无需调整 D = nx.DiGraph() edges= [('CD', 'MAR', {'capacity': 200}), ('CD', 'RIC', {'capacity': 200}), ('CD', 'NCA',{'capacity': 150}), ('RIC', 'NCA', {'capacity': 145}), ('NCA', 'RIC', {'capacity': 125}), ('RIC', 'MAR', {'capacity': 100}), ('RIC', 'WDC', {'capacity': 230}), ('NCA', 'WDC', {'capacity': 100}), ('VB', 'RIC', {'capacity': 275}), ('MAR', 'WDC', {'capacity': 150}), ('NCA', 'VB', {'capacity': 200}), ('VB', 'NCA', {'capacity': 175}), ('VB', 'WDC', {'capacity': 50})] D.add_edges_from(edges) print('Number of Nodes:',D.number_of_nodes()) print('Nodes:', list(D.nodes)) print('Number of Edges',D.number_of_edges()) # 优化边遍历写法,避免索引顺序不一致导致的属性匹配错误 for u, v, attr in D.edges(data=True): print('Edge:', u, '->', v, '属性:', attr) maxflow=nx.maximum_flow(D,'CD','WDC') print('Flow from each node (From Node: {Node receiving: Flow})') for key in maxflow[1]: print(key, ' : ', maxflow[1][key])
效果验证
替换为有向图后:
- 单向边仅存在指定方向的路径,不会出现反向流
- 双向边的两个方向容量独立,计算最大流时会分别统计
- 不会再出现边方向自动反转的问题
内容的提问来源于stack exchange,提问作者Patrick McKercher
相关产品推荐
相关产品推荐

