Networkx:如何以广度优先的方式迭代DiGraph的所有边缘?

时间:2018-03-21 21:15:47

标签: python networkx directed-acyclic-graphs digraphs

我有一个networkx DiGraph(不一定是非循环的)。所有节点都有一个共同的前驱:源节点0。

我希望能够以广度优先顺序编辑所有边的属性。为此,我希望能够以广度优先的方式从源头开始迭代所有边缘。

bfs_edges允许经典的广度优先搜索,这会导致以下问题:如果一个节点有n个直接前驱,那么迭代器中只会出现一个边,而不是n。

我的边缘:

([(0.0, 1), (1, 2), (1, 7), (2, 3), (2, 4), (3, 5), (3, 6), (4, 5), (4, 6), (5, 7), (6, 7)])

bfs_edges返回的内容:

for edge in nx.bfs_edges(digraph,0):
print(edge[0], edge[1])

0 1
1 2
1 7
2 3
2 4
3 5
3 6

有人可以帮忙吗?谢谢!

1 个答案:

答案 0 :(得分:0)

也许使用NetworkX bfs_predecessors更适合你的情况,因为它返回一个前辈的迭代器。您可以使用此示例找到此方法here的文档。

>>> G = nx.path_graph(3)
>>> print(dict(nx.bfs_predecessors(G, 0)))
{1: 0, 2: 1}
>>> H = nx.Graph()
>>> H.add_edges_from([(0, 1), (0, 2), (1, 3), (1, 4), (2, 5), (2, 6)])
>>> dict(nx.bfs_predecessors(H, 0))
{1: 0, 2: 0, 3: 1, 4: 1, 5: 2, 6: 2}

修改

如果要查找节点中的所有前置任务,则需要迭代运行NetworkX predecessors并打印节点,以下示例执行此操作。

import networkx as nx

G = nx.DiGraph()
G.add_nodes_from([1,2,3])
G.add_edges_from([(2, 1), (3, 1), (2, 3)])

def activate_node(g, start_node):          
    stack = [start_node]

    while stack:
        node = stack.pop()
        preds = g.predecessors(node)
        stack += preds
        print('%s -> %s' % (node, preds))

activate_node(G, 1)

这将打印:

1 -> [2, 3]
3 -> [2]
2 -> []
2 -> []

上面的代码改编自question