Cormen ve arkadaşlarının Lemma 22.11'e göre , Algoritmalara Giriş (CLRS):
Yönlendirilmiş bir G grafiği, yalnızca G'nin ilk derinlik araştırması arka kenar vermezse döngüsel değildir.
Bu birkaç cevapta belirtilmiştir; burada CLRS'in 22. bölümüne dayanan bir kod örneği de sunacağım. Örnek grafik aşağıda gösterilmiştir.
Önce derinlik araması için CLRS sahte kodunu okur:
CLRS Şekil 22.4'teki örnekte, grafik iki DFS ağacından oluşur: biri u , v , x ve y düğümlerinden ve diğeri w ve z düğümlerinden oluşur . Her ağaç bir arka kenarı içerir: gelen bir x için v ve diğer bir z için z (kendi kendine döngü).
Anahtar gerçekleştirilmesi zaman bir arka kenarı olarak karşılaşılan olmasıdır DFS-VISIT
komşuları yineleme sırasında, fonksiyon v
arasında u
, bir düğüm ile karşılaşıldığındaGRAY
renk.
Aşağıdaki Python kodu, CLRS'in sözde kodunun if
döngüleri algılayan bir cümle ile uyarlanmasıdır :
import collections
class Graph(object):
def __init__(self, edges):
self.edges = edges
self.adj = Graph._build_adjacency_list(edges)
@staticmethod
def _build_adjacency_list(edges):
adj = collections.defaultdict(list)
for edge in edges:
adj[edge[0]].append(edge[1])
return adj
def dfs(G):
discovered = set()
finished = set()
for u in G.adj:
if u not in discovered and u not in finished:
discovered, finished = dfs_visit(G, u, discovered, finished)
def dfs_visit(G, u, discovered, finished):
discovered.add(u)
for v in G.adj[u]:
# Detect cycles
if v in discovered:
print(f"Cycle detected: found a back edge from {u} to {v}.")
# Recurse into DFS tree
if v not in finished:
dfs_visit(G, v, discovered, finished)
discovered.remove(u)
finished.add(u)
return discovered, finished
if __name__ == "__main__":
G = Graph([
('u', 'v'),
('u', 'x'),
('v', 'y'),
('w', 'y'),
('w', 'z'),
('x', 'v'),
('y', 'x'),
('z', 'z')])
dfs(G)
Bu örnekte, time
yalnızca döngüleri tespit etmekle ilgilendiğimiz için CLRS'deki sözde kodunun yakalanmadığını unutmayın. Ayrıca, kenar listesinden bir grafiğin bitişik liste temsilini oluşturmak için bazı kazan plakası kodu da vardır.
Bu komut dosyası yürütüldüğünde, aşağıdaki çıktıyı yazdırır:
Cycle detected: found a back edge from x to v.
Cycle detected: found a back edge from z to z.
Bunlar CLRS Şekil 22.4'teki örnekteki tam arka kenarlardır.