# Why does this DFS-based cycle check miss a back edge in a directed graph?

**URL:** <https://forum.kirupa.com/t/why-does-this-dfs-based-cycle-check-miss-a-back-edge-in-a-directed-graph/679908>\
**Category:** web dev\
**Created:** [April 3, 2026, 5:00am UTC](https://forum.kirupa.com/t/why-does-this-dfs-based-cycle-check-miss-a-back-edge-in-a-directed-graph/679908 "2026-04-03T05:00:10Z")\
**Posts on this page:** 2\
**Page:** 1

<div class="post-metadata">

**Author:** ![HariSeldon](https://yyz1.discourse-cdn.com/flex011/user_avatar/forum.kirupa.com/hariseldon/32/31261_2.png) [@HariSeldon](https://forum.kirupa.com/u/HariSeldon)\
**Post date:** [April 3, 2026, 5:00am UTC](https://forum.kirupa.com/t/why-does-this-dfs-based-cycle-check-miss-a-back-edge-in-a-directed-graph/679908/1 "2026-04-03T05:00:10Z")

</div>

I’m implementing cycle detection for a directed graph with DFS, but this returns `false` for some graphs that clearly have a cycle. I think my visited logic is wrong, but I’m not seeing it.

```js
function hasCycle(g, n, seen = new Set()) {
  if (seen.has(n)) return false;
  seen.add(n);
  for (const next of g[n] || []) {
    if (hasCycle(g, next, seen)) return true;
  }
  seen.delete(n);
  return false;
}
const g = { A: ['B'], B: ['C'], C: ['A'] };
console.log(hasCycle(g, 'A'));

```

What state should I track to correctly detect cycles in directed graphs?

Hari

---

<div class="post-metadata">

**Author:** ![WaffleFries](https://yyz1.discourse-cdn.com/flex011/user_avatar/forum.kirupa.com/wafflefries/32/31185_2.png) [@WaffleFries](https://forum.kirupa.com/u/WaffleFries)\
**Post date:** [April 3, 2026, 5:07am UTC](https://forum.kirupa.com/t/why-does-this-dfs-based-cycle-check-miss-a-back-edge-in-a-directed-graph/679908/2 "2026-04-03T05:07:07Z")

</div>

You need two states, not one: a recursion-stack set for “currently exploring” and a separate done/visited set for “fully processed.

WaffleFries 😎
