কর্পেন এট আল। এর লেমা 22.11 অনুসারে , আলগোরিদিমগুলির পরিচিতি (সিএলআরএস):
একটি নির্দেশিত গ্রাফ জি অ্যাসাইক্লিক এবং যদি কেবলমাত্র জি এর গভীরতা-প্রথম অনুসন্ধানের কোনও পেছনের কিনারা পাওয়া যায় না।
এটি বিভিন্ন উত্তরে উল্লেখ করা হয়েছে; এখানে আমি সিএলআরএস এর 22 অধ্যায়টির উপর ভিত্তি করে একটি কোড উদাহরণও সরবরাহ করব। উদাহরণ গ্রাফ নীচে চিত্রিত হয়।
গভীরতা-প্রথম অনুসন্ধানের জন্য সিএলআরএসের সিউডো কোডটি পড়ে:
CLRS চিত্র 22.4 মধ্যে উদাহরণে, গ্রাফ দুটি DFS গাছ নিয়ে গঠিত: এক নোড গঠিত U , V , এক্স , এবং Y নোড অন্যান্য, এবং W এবং জেডের সমন্বিত । প্রতিটি গাছে একটি পিছনের প্রান্ত থাকে: x থেকে v এবং অন্যটি z থেকে z (একটি স্ব-লুপ) থাকে।
মূল উপলব্ধিটি হ'ল পিছনে একটি প্রান্তটি সম্মুখীন হয় যখন, DFS-VISIT
ফাংশনটিতে, যখন প্রতিবেশীদের কাছ v
থেকে পুনরাবৃত্তি করা হয় u
, GRAY
রঙের সাথে একটি নোডের মুখোমুখি হয় ।
নিম্নলিখিত পাইথন কোডটি একটি 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
সিএলআরএস-এর সিউডোকোড ক্যাপচার করা হয়নি কারণ আমরা কেবল চক্র সনাক্ত করতে আগ্রহী। প্রান্তের একটি তালিকা থেকে গ্রাফের সংলগ্ন তালিকা উপস্থাপনা তৈরির জন্য কিছু বয়লারপ্লেট কোডও রয়েছে।
এই স্ক্রিপ্টটি কার্যকর করা হলে, এটি নিম্নলিখিত আউটপুট প্রিন্ট করে:
Cycle detected: found a back edge from x to v.
Cycle detected: found a back edge from z to z.
এগুলি সিএলআরএস চিত্র 22.4 এর উদাহরণে ঠিক পিছনের প্রান্তগুলি।