1

我有一个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

任何人都可以帮忙吗?谢谢!

4

1 回答 1

0

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

>>> 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前辈并打印节点,下面的例子就是这样做的。

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 -> []

上面的代码改编自这个问题

于 2018-03-21T21:26:25.713 回答