कॉर्मेन एट अल। के लेम्मा 22.11 के अनुसार , एल्गोरिदम का परिचय (CLRS):
एक निर्देशित ग्राफ जी एसाइक्लिक है यदि और केवल अगर जी की गहराई-पहली खोज से कोई बैक एज नहीं निकलता है।
इसका उल्लेख कई उत्तरों में किया गया है; यहाँ मैं CLRS के अध्याय 22 के आधार पर एक कोड उदाहरण भी प्रदान करूँगा। उदाहरण ग्राफ नीचे सचित्र है।
गहराई से खोज के लिए CLRS का छद्म कोड पढ़ता है:
सीएलआरएस चित्रा 22.4 में उदाहरण में, ग्राफ में दो डीएफएस पेड़ शामिल हैं: एक में नोड यू , वी , एक्स , और वाई और नोड्स डब्ल्यू और जेड के अन्य शामिल हैं । प्रत्येक पेड़ में एक बैक एज होता है: एक x से v तक और दूसरा z से z तक (एक आत्म पाश)।
प्रमुख बोध यह है कि एक बैक एज का सामना तब होता है, जब DFS-VISIT
फ़ंक्शन में, पड़ोसी v
के साथ पुनरावृत्ति करते हुए u
, नोड के साथ सामना किया जाता हैGRAY
रंग के ।
निम्नलिखित पायथन कोड CLRS 'pseudocode का एक if
क्लॉज जोड़ा गया है जो चक्रों का पता लगाता है:
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)
ध्यान दें कि इस उदाहरण में, time
CLRS के छद्मकोड पर कब्जा नहीं किया गया है क्योंकि हम केवल चक्रों का पता लगाने में रुचि रखते हैं। किनारों की सूची से ग्राफ के आसन्न सूची प्रतिनिधित्व के निर्माण के लिए कुछ बॉयलरप्लेट कोड भी है।
जब इस स्क्रिप्ट को निष्पादित किया जाता है, तो यह निम्न आउटपुट प्रिंट करता है:
Cycle detected: found a back edge from x to v.
Cycle detected: found a back edge from z to z.
ये CLRS चित्रा 22.4 में उदाहरण में बिल्कुल पीछे के किनारे हैं।