Exemple #1
0
        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);
        }
Exemple #2
0
        // 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);
        }
Exemple #3
0
        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);
        }
Exemple #4
0
    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);
    }
Exemple #5
0
 public void AddFriendAssociation(int firstPeer, int secondPeer)
 => _friendSets.UnionSets(firstPeer, secondPeer);
Exemple #6
0
        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));
                    }
                }
            }
        }