2017-02-02 5 views
0

グラフを取ってトポロジカルに並べ替えるアルゴリズムを探しています。それぞれのリストには、トポロジカルなソートされた頂点が含まれています。トポロジカルなグラフをバケットに分解して分割したサブグラフを作成する

ノードが2つの異なるリスト内のノードに依存する場合、難しい部分はリストをマージしています。ここで

はグラフが{node: [node, node, ...]}

位相的にばらばらリストにソートグラフ

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') 

答えて

0

まず塗りつぶしアルゴリズムを使用してばらばら部分グラフに分割して、トポロジカルにソート辞書である私の不完全なコード/擬似コードでありますそれぞれ。

+0

フラッドフィルアルゴリズムは、有向グラフのサブグラフ全体をどのように識別できますか?始めるノードによっては、アルゴリズムがさらに上流のノードに到達しない場合があり、グラフが非循環の場合は絶対に行われません。 – shane

+0

@shane有向グラフから無向グラフを作成し、フラッドフィルを行い、分割された元のグラフに戻り、トポロジカルな各部分グラフをトポロジカルにソートすることができます。 – btilly

関連する問題