パイソンコード。時間計算量はO ( V + E ) です。ここで、VとEはそれぞれ頂点とエッジの数です。バックトラッキングなしですべての頂点を含むパスが存在する最悪のケース (つまり、検索パスが線形チェーンである) により、空間の複雑さは O( V )です。
スタックは (vertex, vertex_edge_index) の形式のタプルを格納するため、その頂点から処理された最後のエッジの直後のエッジにある特定の頂点から DFS を再開できます (再帰的 DFS の関数呼び出しスタックと同様)。
コード例では、すべての頂点が他のすべての頂点に接続されている完全な有向グラフを使用しています。したがって、グラフはエッジ リスト (グラフGにはすべての頂点が含まれる)であるため、ノードごとに明示的なエッジ リストを格納する必要はありません。
numv = 1000
print('vertices =', numv)
G = [Vertex(i) for i in range(numv)]
def dfs(source):
s = []
visited = set()
s.append((source,None))
time = 1
space = 0
while s:
time += 1
current, index = s.pop()
if index is None:
visited.add(current)
index = 0
# vertex has all edges possible: G is a complete graph
while index < len(G) and G[index] in visited:
index += 1
if index < len(G):
s.append((current,index+1))
s.append((G[index], None))
space = max(space, len(s))
print('time =', time, '\nspace =', space)
dfs(G[0])
出力:
time = 2000
space = 1000
ここでの時間はEではなくV操作を測定していることに注意してください。値はnumv *2 です。これは、すべての頂点が 2 回 (検出時と終了時に 1 回) 考慮されるためです。