Python NetworkX encuentra un subgrafo en un gráfico dirigido desde un nodo como raíz

Estoy escribiendo un código para extraer información de un gráfico dirigido. Esta gráfica también tiene ciclos. Por ejemplo,

A->B->C->D A->E->F->A B->F->G 

Desde este gráfico, quiero crear un sub gráfico o la lista de nodos, donde la entrada sería cualquier nodo, y la salida sería el gráfico donde el nodo de entrada es la raíz, o la lista de nodos que tiene todos los Nodos secundarios (hasta el final del gráfico) desde los nodos de entrada

Por ejemplo, en el ejemplo anterior, 1. Si el nodo de entrada es C, la salida sería D 2. Si el nodo de entrada es B, el nodo de salida sería C, D, F, G, A (ya que hay un ciclo, que hace de A a B bidireccional) 3. Si la entrada es G, la salida está en blanco o nula.

¿Hay alguna funcionalidad en python networkx que pueda usar para resolver este problema?

Alternativamente, ¿hay alguna otra herramienta que pueda ayudarme a resolver este problema?

Lo que quieres es la función dfs_preorder_nodes() . Aquí hay una pequeña demostración basada en sus datos:

 import networkx as nx g = nx.DiGraph() g.add_edge('A', 'B') g.add_edge('B', 'C') g.add_edge('C', 'D') g.add_edge('A', 'E') g.add_edge('E', 'F') g.add_edge('F', 'A') g.add_edge('B', 'F') g.add_edge('F', 'G') print('A:', list(nx.dfs_preorder_nodes(g, 'A'))) print('B:', list(nx.dfs_preorder_nodes(g, 'B'))) print('G:', list(nx.dfs_preorder_nodes(g, 'G'))) 

Salida:

 A: ['A', 'B', 'C', 'D', 'F', 'G', 'E'] B: ['B', 'C', 'D', 'F', 'A', 'E', 'G'] G: ['G'] 

La salida incluye el nodo de inicio. Por lo tanto, si no lo desea, simplemente elimine el primer elemento de la lista.

Tenga en cuenta que dfs_preorder_nodes() devuelve un objeto generador. Es por eso que llamé a list() para obtener un resultado útil.

nx.ego_graph() hace exactamente lo que usted describe. Usando el ejemplo dado por @Hai Vu:

 g = nx.DiGraph() g.add_edge('A', 'B') g.add_edge('B', 'C') g.add_edge('C', 'D') g.add_edge('A', 'E') g.add_edge('E', 'F') g.add_edge('F', 'A') g.add_edge('B', 'F') g.add_edge('F', 'G') a = nx.ego_graph(g, 'A', radius=100) a.node #out: NodeView(('A', 'B', 'C', 'D', 'E', 'F', 'G')) list(nx.ego_graph(g, 'G', radius=100).node) #out: ['G'] 

radius debe ser un número arbitrariamente grande si desea obtener todos los nodos en el árbol hasta las hojas.