diff --git a/src/tests/utils/DynamicDSUTest.java b/src/tests/utils/DynamicDSUTest.java new file mode 100644 index 0000000..fe15816 --- /dev/null +++ b/src/tests/utils/DynamicDSUTest.java @@ -0,0 +1,25 @@ +package tests.utils; + +import static org.junit.jupiter.api.Assertions.*; + +import org.junit.jupiter.api.Test; + +import utils.DynamicDisjointSetUnion; + +public class DynamicDSUTest { + + @Test + void DDSUTest() { + DynamicDisjointSetUnion dsu = new DynamicDisjointSetUnion<>(); + dsu.add("a"); + dsu.add("b"); + dsu.add("c"); + dsu.union("a", "b"); + assertTrue(dsu.same("a", "b")); + assertFalse(dsu.same("a", "c")); + assertFalse(dsu.same("b", "c")); + + + } + +} diff --git a/src/utils/DynamicDisjointSetUnion.java b/src/utils/DynamicDisjointSetUnion.java new file mode 100644 index 0000000..06cc58e --- /dev/null +++ b/src/utils/DynamicDisjointSetUnion.java @@ -0,0 +1,66 @@ +package utils; + +import java.util.HashMap; +import java.util.Map; + +public class DynamicDisjointSetUnion { + + private Map parent; + private Map size; + + public DynamicDisjointSetUnion() { + parent = new HashMap<>(); + size = new HashMap<>(); + } + + public void add(T x) { + if (! parent.containsKey(x)) { + parent.put(x, x); + size.put(x, 1); + } + } + + public T find(T x) { + if (! parent.containsKey(x)) { + throw new RuntimeException(x.toString() + " does not exist"); + } + + if (! parent.get(x).equals(x)) { + parent.put(x, find(parent.get(x))); + } + return parent.get(x); + } + + public void union(T x, T y) { + add(x); + add(y); + + T rx = find(x); + T ry = find(y); + + if (rx.equals(ry)) { + return; + } + + if (size.get(rx) < size.get(ry)) { + T tmp = rx; + rx = ry; + ry = tmp; + } + + parent.put(ry, rx); + size.put(rx, size.get(rx) + size.get(ry)); + } + + public boolean same(T x, T y) { + if ((! parent.containsKey(x)) || (! parent.containsKey(y))) { + return false; + } + return find(x).equals(find(y)); + } + + public int componentSize(T x) { + return size.get(x); + } + +}