Graphs
Table of contents
Graph: G = (V, E)
, where for graph G
, V
is a set of vertices, and E
is a set of edges. Every edge E
is a tuple (v, w)
where v, w
$\in$ V
Subgraph: A subgraph s
is a set of edges e
and vertices v
such that $e \in E$ and $v \in V$
Representation: Adjacency Matrix and Adjacency List
Detecting Cycles in a Directed Graph
Use DFS and maintain a stack of nodes, if a visited node is present in the stack, cycle detected. [Leetcode #207]
Time Complexity: O(V+E) Space Complexity:O(V)
def DFS(visited, i, stack)
visited[i], stack[i] = True, True
for j in adj[i]:
if not visited[i]:
if DFS(visited, j, stack): return True
elif stack[j]: return True
stack[j]=False
return False
def detectCycle(V, adj):
visited, stack = [False]*V, [False]*V
for i in range(V):
if not visited[i]:
if DFS(visited, i, stack): return True
return False
Detecting Cycles in an Undirected Graph
Use DFS and a cycle is present if an adjacent vertex is already visited and is not the parent of the current vertex
Time Complexity: O(V+E) Space Complexity:O(V)
def DFS(visited, i, parent)
visited[i] = True
for j in adj[i]:
if not visited[i]:
if DFS(visited, j, i): return True
elif parent!=j: return True
return False
def detectCycle(V, adj):
visited = [False]*V
for i in range(V):
if not visited[i]:
if DFS(visited, i, -1): return True
return False
References
- Runstone Academy PythonDS Book Chapter 8: Graphs
- Detect Cycles in a directed graph
- Detect Cycles in an undirected graph