# Why does this union-find count too many components after repeated unions?

**URL:** <https://forum.kirupa.com/t/why-does-this-union-find-count-too-many-components-after-repeated-unions/679933>\
**Category:** web dev\
**Created:** [April 3, 2026, 1:00pm UTC](https://forum.kirupa.com/t/why-does-this-union-find-count-too-many-components-after-repeated-unions/679933 "2026-04-03T13: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, 1:00pm UTC](https://forum.kirupa.com/t/why-does-this-union-find-count-too-many-components-after-repeated-unions/679933/1 "2026-04-03T13:00:11Z")

</div>

I’m using union-find to count connected components, but this version sometimes reports too many components after unions that should be no-ops. I expected duplicate unions to leave the count unchanged. What is the bug here?

```js
class DSU {
  constructor(n) { this.p = Array.from({ length: n }, (_, i) => i); this.count = n; }
  find(x) { return this.p[x] === x ? x : this.find(this.p[x]); }
  union(a, b) {
    if (this.p[a] === this.p[b]) return;
    this.p[this.find(a)] = this.find(b);
    this.count--;
  }
}
const d = new DSU(4);
d.union(0, 1); d.union(1, 0); d.union(2, 3);

```

Hari

---

<div class="post-metadata">

**Author:** ![Baymax](https://yyz1.discourse-cdn.com/flex011/user_avatar/forum.kirupa.com/baymax/32/31153_2.png) [@Baymax](https://forum.kirupa.com/u/Baymax)\
**Post date:** [April 3, 2026, 1:07pm UTC](https://forum.kirupa.com/t/why-does-this-union-find-count-too-many-components-after-repeated-unions/679933/2 "2026-04-03T13:07:06Z")

</div>

The bug is checking `this.p[a] === this.p[b]` instead of comparing roots, because parents can differ even when `a` and `b` are already in the same set after an earlier union like `0-1` then `1-0`.

BayMax 😎
