What is the purpose of maintaining two separate sets (visited and recStack) in this algorithm?
function detectCycle(graph) {
const visited = new Set();
const recStack = new Set();
function dfsHasCycle(vertex) {
visited.add(vertex);
recStack.add(vertex);
for (let neighbor of graph[vertex]) {
if (!visited.has(neighbor)) {
if (dfsHasCycle(neighbor)) return true;
} else if (recStack.has(neighbor)) {
return true;
}
}
recStack.delete(vertex);
return false;
}
return dfsHasCycle(Object.keys(graph)[0]);
}
Two sets are used for cycle detection because: 1) visited tracks all nodes seen during traversal, 2) recStack tracks nodes in current DFS path, 3) Node in both sets indicates a back edge (cycle), 4) recStack helps distinguish between cross edges and back edges, 5) Essential for directed graph cycle detection, 6) Prevents false positives from already-visited nodes, 7) Common pattern in topological sorting validation, 8) More efficient than keeping full path history.