使用networkx bfs_tree以BFS顺序获取有向图的节点列表

时间:2015-03-16 17:00:24

标签: python graph networkx breadth-first-search

例如,给定:

G = nx.DiGraph()
G.add_path([0, 1])
G.add_path([0, 2])
G.add_path([0, 3])

G.add_path([1, 11])
G.add_path([1, 12])

G.add_path([2, 21])
G.add_path([2, 22])

G.add_path([3, 31])
G.add_path([3, 32])

我想要这个: 0, 1, 2, 3, 11, 12, 21, 22, 31, 32

为什么bfs_tree的networkx文档在其示例中实际使用bfs_edges?而不是bfs_treebfs_tree documentation中给出的示例中的关键字:

print(list(nx.bfs_edges(G,0))) 

使用bfs_edge代替,例如via print(list(nx.algorithms.bfs_tree(G, 0).edges()))似乎导致与示例代码返回的列表相同,但显然更复杂。我可以用更简单的方式使用bfs_tree()来获取BFS顺序中有向图的_nodes_列表吗?

当然,我可以迭代从bfs_treebfs_edges返回的列表,只取第二个元素。但是,有没有更简单的方法?

1 个答案:

答案 0 :(得分:1)

为什么不展平边元组列表(每2个节点),然后取set个节点以确保唯一性?

list(set(sum(list(nx.algorithms.bfs_tree(G, 0).edges()), ())))

在您的假设解决方案中,您将忽略0节点,并且它不会包含在您的输出中。

或者您可以使用bfs_successors()方法获取节点的dict(传入0节点)并获取values

[0].extend(nx.algorithms.bfs_successors(G, 0).values())
# Get your first, node, and extend with a list of all successor nodes in BFS order