Networkx graph searches: dfs_successors vs. dfs_predecessors

☆樱花仙子☆ 提交于 2019-12-01 05:03:08

问题


Consider the following graph structure (borrowed from this question):

G = networkx.DiGraph()
G.add_edges_from([('n', 'n1'), ('n', 'n2'), ('n', 'n3')])
G.add_edges_from([('n4', 'n41'), ('n1', 'n11'), ('n1', 'n12'), ('n1', 'n13')])
G.add_edges_from([('n2', 'n21'), ('n2', 'n22')])
G.add_edges_from([('n13', 'n131'), ('n22', 'n221')])

which yields:

n---->n1--->n11
 |     |--->n12
 |     |--->n13
 |           |--->n131 
 |--->n2              
 |     |---->n21     
 |     |---->n22     
 |            |--->n221 
 |--->n3

I can perform a depth-first search for successors starting at node n and get:

> dfs_successors(G, 'n')
{'n': ['n1', 'n2', 'n3'],
 'n1': ['n12', 'n13', 'n11'],
 'n13': ['n131'],
 'n131': ['n221'],
 'n2': ['n22', 'n21']}

However, when I do a depth-first search for predecessors at e.g. node n221, nothing happens:

> dfs_predecessors(G, 'n221')
{}

I would expect the output to be:

{'n221': ['n22', 'n2', 'n']}

What is going wrong here, and how can I get my expected behaviour?


回答1:


The dfs_predecessors() function only gives the immediate predecessor. So if you say this (DFS of G from node 'n' and looking back one link from 'n22')

>>> print(networkx.dfs_predecessors(G, 'n')['n221'])
n22

you get part of what you want.

To get the path in the DFS tree from n221 back to the root:

>>> T = networkx.dfs_tree(G,'n')

>>> print(networkx.shortest_path(G.reverse(),'n221','n'))
['n221', 'n22', 'n2', 'n']


来源:https://stackoverflow.com/questions/21866902/networkx-graph-searches-dfs-successors-vs-dfs-predecessors

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!