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

如何使用Networkx在MultiDigraph中查找含正向、反向边的路径?

实现方法:允许反向遍历边的路径查找

当然可以实现!你要找的是允许反向遍历原有边的路径——也就是把原图中3→2的边反过来走成2→3,再配合1→2的正向边,形成1→2→3的路径。下面给你两种基于NetworkX的实现方案:

方案1:构建包含反向边的新图

这种方法会创建一个新的有向图,同时包含原图的所有边和它们的反向边,之后直接在新图里执行常规的路径查找:

import networkx as nx

# 初始化你原有的MultiDiGraph
G = nx.MultiDiGraph()
G.add_edge(1, 2, attr=0.5)
G.add_edge(3, 2, attr=1.0)

# 创建包含原边和反向边的新图
G_with_reverses = nx.MultiDiGraph()

# 添加原图的所有边
for u, v, attrs in G.edges(data=True):
    G_with_reverses.add_edge(u, v, **attrs)
    # 添加对应反向边,这里保留了原边的属性,你也可以根据需求修改
    G_with_reverses.add_edge(v, u, **attrs)

# 查找从1到3的最短路径
try:
    path = nx.shortest_path(G_with_reverses, source=1, target=3)
    print(f"找到的路径: {path}")  # 输出: 找到的路径: [1, 2, 3]
except nx.NetworkXNoPath:
    print("不存在符合条件的路径")

方案2:自定义邻居生成器(无需创建新图)

如果你不想额外创建图,可以在路径查找时自定义邻居规则,允许同时遍历当前节点的出边邻居(正向走)和入边邻居(反向走):

import networkx as nx

# 初始化原图
G = nx.MultiDiGraph()
G.add_edge(1, 2, attr=0.5)
G.add_edge(3, 2, attr=1.0)

# 自定义邻居生成函数:返回正向和反向可到达的节点
def allow_reverse_neighbors(graph, node):
    # 合并出边邻居(successors)和入边邻居(predecessors)
    return set(graph.successors(node)) | set(graph.predecessors(node))

# 查找所有从1到3的简单路径
paths = list(nx.all_simple_paths(G, source=1, target=3, neighbor=allow_reverse_neighbors))
print(f"所有符合条件的路径: {paths}")  # 输出: 所有符合条件的路径: [[1, 2, 3]]

方案对比

  • 方案1适合需要多次执行此类路径查询的场景,一次构建新图后可以重复使用;
  • 方案2更轻量化,单次查询时无需额外占用内存存储新图,效率更高。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 08:52:14