在 NetworkX 上使用广度优先搜索查找前驱只为每个节点返回 1 个前驱

问题描述

我想使用 NetworkX 的 breadth first search 找到图中所有节点的所有直接前辈。下面是我的代码和图形图像:

import networkx as nx
import matplotlib.pyplot as plt
nodes = ['0','1','2','3','4','5']
G = nx.DiGraph(name='G')
G.add_nodes_from(nodes)
edges = [('0','1'),('2',('5','4'),('1','3'),('3','4')]
G.add_edges_from(edges)

bfs = nx.bfs_predecessors(G,source='0')
bfs = dict(bfs)
nx.draw(G,font_weight='bold',with_labels=True)
plt.show()
plt.savefig('graph.png')
print(bfs)

enter image description here

以上代码返回{'1': '0','3': '1','4': '3'}
我期待节点“1”的前辈是“0”和“2”,对于节点“4”,它们是“5”和“3”。为什么我每个节点只得到 1 个前驱?

解决方法

因为这是一个有向图,BFS 尊重方向:它只探索出弧。虽然在有向图中存在从节点 2 到节点 1 的传入弧,但从节点 0 开始的 BFS 无法计算出这一点,因为它只遵循传出弧并且弧 1->2 不是从节点 1 传出。

如果您从节点 2 启动 BFS,您会发现它将报告 2 作为 1 的前身,但它不会报告 0 作为 1 的前身。如果您从node 4 你会发现它根本不会报告任何前辈。这是因为没有办法从节点 4out,所以 BFS 将在节点 4 开始和结束。