此有向图操作需要哪种算法?

时间:2018-08-25 09:40:43

标签: networkx graph-theory digraphs

我可能对此想法太过思索,但缺少明显的东西,但是我想知道可以使用哪种NetworkX算法来实现以下目标:

给出一个DiGraph,例如:

Simple DiGraph

以及节点列表,例如:Q1,Q2

查找与Q1和Q2连接(或换句话说,其子代)的所有节点,结果如下:

Q1

Q2

哪种算法可以实现?

2 个答案:

答案 0 :(得分:0)

看起来您只需要对networkx.Digraph.predecessors进行递归

答案 1 :(得分:0)

第一种方法是使用列表,从您的节点开始访问每个节点的前身,并将其放在列表中,以这种方式用找到的节点构建树。

另一种方法是在图形上使用访问(DFS或BFS)来反转边缘。

考虑以下示例,其中我从节点“ Q1”开始构建bfs tree

import networkx as nx

g = nx.DiGraph()

g.add_edges_from([("M1","Q1"),("I1","M1"),("I2","M1"),("I3","M1"),("I3","M2"),("M2","Q2")])

#creating a graph with the edges reversed
g2 = nx.DiGraph()
g2.add_edges_from([(v,u) for (u,v) in g.edges()])

t = nx.bfs_tree(g2, "Q1")

for (u,v) in t.edges():
    t.remove_edge(u,v)
    t.add_edge(v,u)


print(t.nodes(),t.edges())
# ['Q1', 'M1', 'I1', 'I2', 'I3'] [('M1', 'Q1'), ('I1', 'M1'), ('I2', 'M1'), ('I3', 'M1')]