สมมติว่าเรามีกราฟไม่มีทิศทาง (undirected graph) ต้องการตรวจสอบว่ามีวัฏจักร (cycle) ที่มีความยาวเป็นเลขคี่ (odd length cycle) หรือไม่
เช่น adj_list = [[1, 2], [0, 3, 4], [0, 3, 4], [1, 2, 4], [1, 2, 3]] ผลลัพธ์ = True มีวัฏจักรคี่ เช่น [0, 1, 3, 4, 2], [1, 3, 4], [2, 3, 4]
ขั้นตอนการแก้ปัญหา (DFS + Depth Parity)
- ฟังก์ชัน
dfs(node, i)โดยi= ความลึก:- ถ้า
node in path: คืนTrueถ้า(i - path[node]) % 2 == 1(ความยาววัฏจักรคี่) - ถ้า
node in visited: คืนFalse - mark
visited,path[node] = i - วนเพื่อนบ้าน
cในarr[node]: ถ้าdfs(c, i+1)คืนTrue - ลบ
path[node], คืนFalse
- ถ้า
- จากเมธอดหลัก:
visited=set(), path={}วนi=0..len(arr)-1ถ้าdfs(i,0)คืนTrue
ตัวอย่างโค้ด
class Solution:
def solve(self, arr):
def dfs(node, i):
if node in path:
return (i - path[node]) % 2 == 1
if node in visited:
return False
visited.add(node)
path[node] = i
for c in arr[node]:
if dfs(c, i + 1):
return True
del path[node]
return False
visited, path = set(), {}
for i in range(len(arr)):
if dfs(i, 0):
return True
return False
ob = Solution()
adj_list = [[1, 2], [0, 3, 4], [0, 3, 4], [1, 2, 4], [1, 2, 3]]
print(ob.solve(adj_list))
ข้อมูลนำเข้า
[[1, 2], [0, 3, 4], [0, 3, 4], [1, 2, 4], [1, 2, 3]]
ผลลัพธ์
True