โจทย์: กราฟไม่มีทิศทาง กำหนด source vertex และ k หาว่ามี simple path (ไม่ซ้ำโหนด) จาก source ยาว ≥ k หรือไม่
ตัวอย่าง: กราฟ 9 โหนด, source=0, k=64 → มี path 0-7-1-2-8-6-5-3-4 ความยาว 68 ≥ 64 → True
อัลกอริทึม DFS + Backtracking
- DFS จาก source พร้อมเก็บ visited path
- ถ้า edge weight ≥ k ที่เหลือ → คืน True ทันที (pruning)
- วนลูปเพื่อนบ้าน: ถ้ายังไม่ visited → mark visited, recurse ด้วย k - weight
- Backtrack: unmark visited
- เจอ path ใด path หนึ่งที่ยาวพอ → True
ตัวอย่างโค้ด
class Graph:
def __init__(self, nodes):
self.nodes = nodes
self.adj = [[] for _ in range(nodes)]
def insert_edge(self, u, v, w):
self.adj[u].append([v, w])
self.adj[v].append([u, w])
def solve(self, source, k, path):
if k <= 0:
return True
for v, w in self.adj[source]:
if path[v]:
continue
if w >= k:
return True
path[v] = True
if self.solve(v, k - w, path):
return True
path[v] = False
return False
def is_there_any_path(self, source, k):
path = [False] * self.nodes
path[source] = True
return self.solve(source, k, path)
# สร้างกราฟตัวอย่าง
nodes = 9
g = Graph(nodes)
edges = [(0,1,5),(0,7,9),(1,2,9),(1,7,12),(2,3,8),(2,8,3),(2,5,5),
(3,4,10),(3,5,15),(4,5,11),(5,6,3),(6,7,2),(6,8,7),(7,8,8)]
for u,v,w in edges:
g.insert_edge(u, v, w)
print(g.is_there_any_path(0, 64)) # True
ผลลัพธ์
True
สรุป: DFS backtracking O(V+E) worst-case แต่ pruning ด้วย w ≥ k ช่วยลดการค้นหา ใช้ได้กับกราฟขนาดเล็ก-กลาง