Suppose we have an undirected graph we have to check whether we can find an odd length cycle inside it or not.
So, if the input is like adj_list = [[1, 2], [0, 3, 4], [0, 3, 4], [1, 2, 4], [1, 2, 3]]
then the output will be True as there are odd length cycles like [0, 1, 3, 4, 2], [1, 3, 4], [2, 3, 4].
To solve this, we will follow these steps −
- Define a function dfs() . This will take node, i
- if node is in path, then
- return true when (i - path[node]) is odd
- if node is visited, then
- return False
- mark node as visited
- path[node] := i
- for each c in arr[node], do
- if dfs(c, i + 1) is true, then
- return True
- if dfs(c, i + 1) is true, then
- del path[node]
- return False
- From the main method do the following −
- visited := a new set, path :=a new map
- for i in range 0 to size of arr, do
- if dfs(i, 0) is true, then
- return True
- return False
Example (Python)
Let us see the following implementation to get better understanding −
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))
Input
[[1, 2], [0, 3, 4], [0, 3, 4], [1, 2, 4], [1, 2, 3]]
Output
True