2017-02-02 2 views
0

Ich suche einen Algorithmus, der einen Graph aufnehmen und topologisch so sortieren kann, dass er eine Menge von Listen erzeugt, die jeweils die topologisch sortierten Vertices eines disjunkten Subgraphen enthalten.Topologisch sortierter Graph in Buckets für disjunkte Subgraphen

Der schwierige Teil besteht darin, die Listen zusammenzuführen, wenn ein Knoten von einem Knoten in zwei verschiedenen Listen abhängt.

Hier ist mein unvollständiger Code/Pseudo-Code, wo Graph, der ein dict {node: [node, node, ...]}

topologisch sortieren Graph in disjunkte Listen

sorted_subgraphs = [] 

while graph: 
    cyclic = True 
    for node, edges in list(graph.items()): 
     for edge in edges: 
      if edge in graph: 
       break 
     else: 
      del graph[node] 
      cyclic = False 

      sub_sorted = [] 
      for edge in edges: 
       bucket.extend(...) # Get the list with edge in it, and remove it from sorted_subgraphs 
      bucket.append(node) 

      sorted_subgraphs.append(bucket) 

    if cyclic: 
     raise Exception('Cyclic graph') 

Antwort

0

Erste teilt es in disjunkte Teilgraphen ist eine Flußfüllen Algorithmus, und dann topologisch sortieren Jeder.

+0

Wie kann der Flutfüllalgorithmus einen ganzen Teilgraphen eines gerichteten Graphen identifizieren? Abhängig davon, mit welchem ​​Knoten Sie beginnen, kann der Algorithmus möglicherweise keine Knoten weiter stromaufwärts erreichen, und absolut nicht, wenn der Graph azyklisch ist. – shane

+0

@shane Konstruieren Sie einen ungerichteten Graphen aus dem gerichteten Graph, füllen Sie ihn mit einer Flut aus, jetzt, da er partitioniert ist, können Sie zum ursprünglichen Graphen zurückkehren und jeden disjunkten Subgraphen topologisch sortieren. – btilly

Verwandte Themen