public void UnionSets2() { var disjointSets = new DisjointSets(5); Assert.AreEqual(5, disjointSets.ElementCount); Assert.AreEqual(5, disjointSets.DisjointSetCount); disjointSets.UnionSets(0, 4); Assert.AreEqual(5, disjointSets.ElementCount); Assert.AreEqual(4, disjointSets.DisjointSetCount); disjointSets.UnionSets(4, 0); Assert.AreEqual(4, disjointSets.DisjointSetCount); disjointSets.UnionSets(3, 0); Assert.AreEqual(3, disjointSets.DisjointSetCount); disjointSets.UnionSets(1, 2); Assert.AreEqual(2, disjointSets.DisjointSetCount); disjointSets.UnionSets(2, 4); Assert.AreEqual(1, disjointSets.DisjointSetCount); disjointSets.UnionSets(1, 3); Assert.AreEqual(1, disjointSets.DisjointSetCount); disjointSets.UnionSets(4, 4); Assert.AreEqual(1, disjointSets.DisjointSetCount); disjointSets.UnionSets(2, 0); Assert.AreEqual(1, disjointSets.DisjointSetCount); }
// Use disjoint sets to create the clusters private static SortedDictionary <double, int>[] DerivePointClustersFromRootSets(SortedDictionary <double, Double2>[] curveRootSets) { // First, gather all points and create the disjoint sets data structure var allPoints = curveRootSets.SelectMany(set => set.Values).ToArray(); var disjointSets = new DisjointSets(allPoints.Length); // Now, reunite the clusters for (int i = 0; i < allPoints.Length; i++) { for (int j = i + 1; j < allPoints.Length; j++) { if (DoubleUtils.RoughlyEquals(allPoints[i], allPoints[j])) { disjointSets.UnionSets(i, j); } } } // Finally, attribute the clusters to the original curves int length = curveRootSets.Length; var clusters = new SortedDictionary <double, int> [length]; int k = 0; for (int i = 0; i < length; i++) { clusters[i] = new SortedDictionary <double, int>(); foreach (var kvp in curveRootSets[i]) { clusters[i][kvp.Key] = disjointSets.FindParentOfSets(k++); } } return(clusters); }
public void UnionSets1() { var disjointSets = new DisjointSets(1); Assert.AreEqual(1, disjointSets.ElementCount); Assert.AreEqual(1, disjointSets.DisjointSetCount); disjointSets.UnionSets(0, 0); Assert.AreEqual(1, disjointSets.ElementCount); Assert.AreEqual(1, disjointSets.DisjointSetCount); }
public static long Solve(int cityCount, List <Edge> edges) { edges.Sort((e1, e2) => e1.Cost.CompareTo(e2.Cost)); var citySets = new DisjointSets(cityCount); long totalEdgeCost = 0; for (int e = 0; e < edges.Count; ++e) { if (!citySets.AreInSameSet(edges[e].SourceCity, edges[e].DestinationCity)) { citySets.UnionSets(edges[e].SourceCity, edges[e].DestinationCity); totalEdgeCost += edges[e].Cost; } } return(totalEdgeCost); }
public void AddFriendAssociation(int firstPeer, int secondPeer) => _friendSets.UnionSets(firstPeer, secondPeer);
public void AreInSameSet() { var disjointSets = new DisjointSets(10); for (int i = 0; i < 10; ++i) { for (int j = 0; j < 10; ++j) { if (i != j) { Assert.IsFalse(disjointSets.AreInSameSet(i, j)); } else { Assert.IsTrue(disjointSets.AreInSameSet(i, j)); } } } disjointSets.UnionSets(0, 3); Assert.IsTrue(disjointSets.AreInSameSet(0, 3)); Assert.IsFalse(disjointSets.AreInSameSet(0, 4)); disjointSets.UnionSets(1, 4); Assert.IsTrue(disjointSets.AreInSameSet(0, 3)); Assert.IsFalse(disjointSets.AreInSameSet(0, 4)); Assert.IsTrue(disjointSets.AreInSameSet(1, 4)); Assert.IsTrue(disjointSets.AreInSameSet(4, 1)); disjointSets.UnionSets(3, 1); Assert.IsTrue(disjointSets.AreInSameSet(0, 4)); Assert.IsTrue(disjointSets.AreInSameSet(1, 3)); Assert.IsTrue(disjointSets.AreInSameSet(5, 5)); Assert.IsFalse(disjointSets.AreInSameSet(1, 5)); disjointSets.UnionSets(2, 5); disjointSets.UnionSets(4, 2); disjointSets.UnionSets(6, 7); disjointSets.UnionSets(7, 9); disjointSets.UnionSets(9, 0); disjointSets.UnionSets(2, 6); for (int i = 0; i < 10; ++i) { for (int j = 0; j < 10; ++j) { if (i != j) { if (i != 8 && j != 8) { Assert.IsTrue(disjointSets.AreInSameSet(i, j)); } else { Assert.IsFalse(disjointSets.AreInSameSet(i, j)); } } else { Assert.IsTrue(disjointSets.AreInSameSet(i, j)); } } } }