我有一个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
有人可以帮忙吗?谢谢!
答案 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。