python - Networkx 图搜索 : dfs_successors vs. dfs_predecessors

标签 python graph traversal networkx

考虑以下图结构(借自 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')])

产生:

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

我可以对从节点 n 开始的后继执行深度优先搜索并得到:

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

但是,当我对前辈进行深度优先搜索时,例如节点 n221,没有任何反应:

> dfs_predecessors(G, 'n221')
{}

我希望输出是:

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

这里出了什么问题,我怎样才能得到预期的行为?

最佳答案

dfs_predecessors() 函数只给出直接的前驱。 因此,如果您这样说(来自节点“n”的 G 的 DFS 并从“n22”回顾一个链接)

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

你得到了你想要的一部分。

获取DFS树中从n221回到根的路径:

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

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

关于python - Networkx 图搜索 : dfs_successors vs. dfs_predecessors,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21866902/

相关文章:

python - 指定 strftime 格式以加速 pandas 的 to_datetime() 方法

python - 将 31-Jul-03 样式更改为 mysql 的日期对象

php - 停留在遍历页面上的 html dom

javascript - 在遍历列表项时添加/删除类

javascript - 如何使用 javascript/jquery 循环遍历表?

python - 从python数组中选择多个元素

python - 为什么pip3安装在python2 sitepackages

用于高性能图形/网络数据结构的java库

java - 我使用 DFS 的 hasCycle() 方法出了什么问题?

使用 Neo4j 图形数据库的图形分区算法