0
0
DSA Typescriptprogramming~10 mins

Cycle Detection in Directed Graph in DSA Typescript - Execution Trace

Choose your learning style9 modes available
Concept Flow - Cycle Detection in Directed Graph
Start at each unvisited node
Mark node as visited and in recursion stack
For each neighbor
If neighbor not visited
Recurse DFS on neighbor
If neighbor in recursion stack
Cycle detected
After all neighbors checked
Remove node from recursion stack
Continue with next node or end
Start DFS from each node, track visited and recursion stack to detect back edges indicating cycles.
Execution Sample
DSA Typescript
function dfs(node) {
  visited[node] = true;
  recStack[node] = true;
  for (let neighbor of graph[node]) {
    if (!visited[neighbor] && dfs(neighbor)) return true;
    else if (recStack[neighbor]) return true;
  }
  recStack[node] = false;
  return false;
}
DFS visits nodes, marks recursion stack, detects cycle if neighbor is in recursion stack.
Execution Table
StepOperationCurrent NodeVisited SetRecursion StackActionCycle DetectedGraph State
1Start DFSA{}{}Mark A visited and in stackNoA->B, B->C, C->A
2Visit neighbor BB{A}{A}Mark B visited and in stackNoA->B, B->C, C->A
3Visit neighbor CC{A,B}{A,B}Mark C visited and in stackNoA->B, B->C, C->A
4Visit neighbor AA{A,B,C}{A,B,C}A is in recursion stackYesCycle detected: A->B->C->A
5Return true up call stackC{A,B,C}{A,B,C}Cycle found, stop DFSYesCycle detected
6Return true up call stackB{A,B,C}{A,B,C}Cycle found, stop DFSYesCycle detected
7Return true up call stackA{A,B,C}{A,B,C}Cycle found, stop DFSYesCycle detected
💡 Cycle detected when visiting node A again while it is in recursion stack
Variable Tracker
VariableStartAfter Step 1After Step 2After Step 3After Step 4Final
visited{}{A}{A,B}{A,B,C}{A,B,C}{A,B,C}
recStack{}{A}{A,B}{A,B,C}{A,B,C}{A,B,C}
currentNodenullABCAA
cycleDetectedfalsefalsefalsefalsetruetrue
Key Moments - 3 Insights
Why do we check if a neighbor is in the recursion stack to detect a cycle?
Because a neighbor in the recursion stack means we found a back edge to an ancestor node in the current DFS path, indicating a cycle (see step 4 in execution_table).
Why do we remove a node from the recursion stack after visiting all neighbors?
Removing the node means we finished exploring all paths from it, so it is no longer in the current DFS path. This prevents false cycle detection later (implied after step 4).
What happens if a node is already visited but not in recursion stack?
It means the node was fully explored in a previous DFS call and no cycle was found through it, so we skip it safely (seen in step 3 when checking neighbors).
Visual Quiz - 3 Questions
Test your understanding
Look at the execution_table, what is the recursion stack after step 3?
A{A}
B{A,B,C}
C{A,B}
D{}
💡 Hint
Check the 'Recursion Stack' column at step 3 in execution_table
At which step does the cycle get detected?
AStep 2
BStep 4
CStep 6
DStep 7
💡 Hint
Look for 'Cycle Detected' column showing 'Yes' in execution_table
If the graph had no cycle, what would happen to the recursion stack after DFS finishes on a node?
AIt becomes empty for that node's DFS call
BIt contains only the last visited node
CIt remains with all nodes visited
DIt contains nodes not visited yet
💡 Hint
Recall key moment about removing node from recursion stack after visiting neighbors
Concept Snapshot
Cycle Detection in Directed Graph using DFS:
- Use two sets: visited and recursion stack
- Start DFS from each unvisited node
- Mark node visited and add to recursion stack
- For each neighbor:
  - If not visited, recurse DFS
  - If in recursion stack, cycle found
- Remove node from recursion stack after all neighbors
- If cycle found anywhere, graph has a cycle
Full Transcript
Cycle detection in a directed graph uses depth-first search (DFS). We keep track of nodes visited and nodes currently in the recursion stack (the current path). Starting from each unvisited node, we mark it visited and add it to the recursion stack. For each neighbor, if it is not visited, we recurse DFS on it. If the neighbor is already in the recursion stack, it means we found a cycle. After exploring all neighbors, we remove the node from the recursion stack. The process repeats until all nodes are checked or a cycle is found. The execution table shows step-by-step how nodes are visited, recursion stack updated, and cycle detected when a back edge is found.