在有向无环网络的组件中得到有序节点x DiGraph

时间:2015-09-17 08:49:18

标签: python networkx directed-graph

我有一个带有子图的有向图,其中节点的顺序很重要。

示例我的图表将有两个子图,都是线性的 1-->2-->3 & 9-->8-->7-->6

注意:节点名称将是随机且唯一的,图表中没有循环

NG = nx.DiGraph()
NG.add_edges_from([(1,2),(2,3)])
NG.add_edges_from([(9,8),(8,7),(7,6)])

我需要获取子图中的子图或节点列表,并根据节点的顺序对节点进行排序。

我试过

[i.nodes() for i in list(nx.weakly_connected_component_subgraphs(NG))]

导致节点列表列表,几乎是正确的,但没有按照它们的连接排序:

[[1, 2, 3], [8, 9, 6, 7]]

我如何继续获取有序节点列表的列表。即:

[[1, 2, 3], [9, 8, 7, 6]]

1 个答案:

答案 0 :(得分:3)

我假设您确定这些是"定向非循环图"。

然后nx.topological_sort(G)根据您想要的顺序对图表中的节点进行排序:也就是说,如果u出现在v之前,则表示v没有路径} u(但可能是从uv的路径)。如果你使用nx.weakly_connected_component_subgraphs(G),你会得到一个你感兴趣的子图的生成器。所以我建议的方法是首先找到子图,然后对节点进行排序。

[nx.topological_sort(H) for H in nx.weakly_connected_component_subgraphs(NG)]

应该得到你想要的东西。

另一种更有效的方法:

以前的代码不是最有效的代码,但很简单。创建每个子图H需要时间,可以避免。一个更有效的方法是weakly_connected_components(NG)(它生成每个子图中的节点列表而不是子图本身)。这将创建像您一样的列表。然后你进行拓扑排序:

[nx.topological_sort(NG, nbunch=subgraph_nodes) for subgraph_nodes in nx.weakly_connected_components(NG)]

这会更有效率。它的作用首先是它生成每个组件中的节点列表。然后,它将对每个组件中的节点进行排序。如果你这样做,你应该看一下source for topological_sort。它将返回从nbunch的任何节点可到达的所有节点的排序列表。在您的情况下,这只是nbunch,但更一般地说,它不仅仅需要返回nbunch

注意:在您的代码中,不需要list(...)。没有它你会得到相同的结果。