Pythonトポロジカルソート

有向非巡回グラフ(Directed Acyclic Graph、略語でDAG)Gのトポロジカルソートは、Gのすべての頂点を線形シーケンスに配置し、グラフ内任意の頂点uとv(エッジ(u,v)∈E(G)の場合)は、線形シーケンスでuがvの前に表示されます。通常、このような線形シーケンスは、トポロジカルオーダーシーケンス(Topological Order)と呼ばれ、略語でトポロジカルシーケンスと呼ばれます。 簡単に言えば、セットの半順序からセットの全順序を取得するために、この操作はトポロジカルソートと呼ばれます。

グラフ理論では、有向非巡回グラフの頂点で構成されるシーケンスは、次の条件が満たされている場合にのみ、グラフのトポロジカルソートと呼ばれます。(英語:Topological sorting)

  • 各頂点が1回だけ表示されます。
  • シーケンスでAがBの前に順序付けされている場合、グラフにはBからAへのパスはありません。

実例

from collections import defaultdict 
 
class Graph: 
    def __init__(self,vertices): 
        self.graph = defaultdict(list) 
        self.V = vertices
  
    def addEdge(self,u,v): 
        self.graph[u].append(v) 
  
    def topologicalSortUtil(self,v,visited,stack): 
  
        visited[v] = True
  
        for i in self.graph[v]: 
            if visited[i] == False: 
                self.topologicalSortUtil(i,visited,stack) 
  
        stack.insert(0,v) 
  
    def topologicalSort(self): 
        visited = [False]*self.V 
        stack =[] 
  
        for i in range(self.V): 
            if visited[i] == False: 
                self.topologicalSortUtil(i,visited,stack) 
  
        print (stack) 
  
g= Graph(6) 
g.addEdge(5, 2); 
g.addEdge(5, 0); 
g.addEdge(4, 0); 
g.addEdge(4, 1); 
g.addEdge(2, 3); 
g.addEdge(3, 1); 

print ("トポロジカルソートの実行結果:")
g.topologicalSort()

上記のコードを実行した結果は次のとおりです。

トポロジカルソートの実行結果:
[5, 4, 2, 3, 1, 0]
Share

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です