2017-11-14 4 views
0

Ich benutze networkX, um ein gerichtetes Diagramm zu erstellen, und ich muss das Sub-Diagramm finden, das einen speziellen Knoten enthält. Ich versuche node_connected_component, aber es kann nicht für gerichtete Graph implementiert werden, gibt es andere Funktion, die für gerichtete Graph in NetworkX implementieren kann?networkX node_connected_component nicht für den gerichteten Typ implementiert

+1

Bedeutet die Tatsache, dass die Verbindungen Richtungs Einfluss Ihrer Entscheidung sind, ob Knoten verbunden sind? Speziell. würden Sie in der Grafik 'A-> B <-> C',' A' als Teil für die verbundene Komponente von 'C' betrachten? Wenn dies der Fall ist, können Sie einfach das Diagramm in ein ungerichtetes umwandeln und die verbundene Komponente in diesem Diagramm finden ("nx.to_undirected" IIRC). – Paul

Antwort

0

Als jemand erwähnte es hängt davon ab, was Sie eine verbundene Komponente in einem gerichteten Graphen nennen:

  1. stark verbundene Komponenten:

    Es ist ein gerichteter Pfad zwischen Knoten A zum Knoten B und ein andere von Knoten B zu Knoten A.

  2. schwach verbundene Komponenten:

    Es gibt einen gerichteten Weg vom Knoten A zum Knoten B, aber nicht notwendigerweise von dem Knoten B A.

zum Knoten Was Sie tun können:

def get_strongly_cc(G, node): 
    """ get storngly connected component of node""" 
    for cc in nx.strongly_connected_components(G): 
     if node in cc: 
      return cc 
    else: 
     return set() 

def get_weakly_cc(G, node): 
    """ get weakly connected component of node""" 
    for cc in nx.weakly_connected_components(G): 
     if node in cc: 
      return cc 
    else: 
     return set() 


weak_component = get_weakly_cc(G, node) # Weakly connected component of node in G 
strong_component = get_strongly_cc(G, node) # Strongly connected component of node in G 
+0

Sie können definitiv besser als dies tun, indem Sie den Code für die stark und schwach verbundenen Komponenten https://networkx.github.io/documentation/stable/_modules/networkx/algorithms/components/strongly_connected.html#strongly_connected_components und https : //networkx.github.io/documentation/stable/_modules/networkx/algorithms/components/weakly_connected.html#weakly_connected_components und führen Sie nur eine einzige Iteration dieser Algorithmen durch, beginnend mit dem ausgewählten Knoten. – Joel

+0

Sie können definitiv besser als das in Bezug auf Effizienz, das Ergebnis wird das gleiche sein obwohl. Die Aufgabe, die Algorithmen, die Sie erwähnt haben, zu optimieren, lohnt sich für große Graphen, die letztendlich von OP-Anforderungen abhängen (die nicht spezifiziert wurden). Aber gute Beobachtung. – rodgdor

Verwandte Themen