微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决在 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 开始和结束。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。