有向非巡回グラフ(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]
コメントを残す