Exemplo n.º 1
0
    public static void Main()
    {
        DisjointSet ds = new DisjointSet();

        ds.makeSet(1);
        ds.makeSet(2);
        ds.makeSet(3);
        ds.makeSet(4);
        ds.makeSet(5);
        ds.makeSet(6);
        ds.makeSet(7);

        ds.union(1, 2);
        ds.union(2, 3);
        ds.union(4, 5);
        ds.union(6, 7);
        ds.union(5, 6);
        ds.union(3, 7);

        Console.WriteLine(ds.findSet(1));
        Console.WriteLine(ds.findSet(2));
        Console.WriteLine(ds.findSet(3));
        Console.WriteLine(ds.findSet(4));
        Console.WriteLine(ds.findSet(5));
        Console.WriteLine(ds.findSet(6));
        Console.WriteLine(ds.findSet(7));
    }
Exemplo n.º 2
0
        public void Compute()
        {
            // clear previous results
            SpanningTreeEdges.Clear();

            // create disjoint set object
            // fill in disjoint sets
            DisjointSet dset = new DisjointSet(VisitedGraph.Vertices);

            // create and fill in priority queue
            PriorityQueue Q = new PriorityQueue(Weights, VisitedGraph.Edges);

            // iterate over edges
            while (Q.Count != 0)
            {
                IEdge e = Q.Peek();
                Q.Pop();
                IVertex u = dset.FindSet(e.Source);
                IVertex v = dset.FindSet(e.Target);
                if (u != v)
                {
                    SpanningTreeEdges.Add(e);
                    dset.Link(u, v);
                }
            }
        }
Exemplo n.º 3
0
        public void Disjoint_Set()
        {
            char result;

            Console.Write("testing Disjoint sets.");
            List <char> elementCollection = new List <char>()
            {
                'A', 'B', 'C', 'D', 'E'
            };
            DisjointSet <char> disjointSet = new DisjointSet <char>(elementCollection);

            char itemtoSearch = 'D';

            result = disjointSet.Find(itemtoSearch);
            Console.WriteLine(string.Format("The searched item {0} is associated with Disjoint Set {1}", itemtoSearch, result));
            disjointSet.Union('D', 'A'); // Sets A is a parent element of item D. Now, A and D will be in the same Set.

            result = disjointSet.Find(itemtoSearch);
            Console.WriteLine(string.Format("The searched item {0} is associated with Disjoint Set {1}", itemtoSearch, result));

            disjointSet.Union('A', 'B'); // Sets B is a parent element of item A. Now, A, B and D will be in the same Set.

            result = disjointSet.Find(itemtoSearch);
            Console.WriteLine(string.Format("The searched item {0} is associated with Disjoint Set {1}", itemtoSearch, result));
        }
Exemplo n.º 4
0
    public ICollection <IGraphEdge <T> > MinimumSpanningTree(IGraph <T> graph)
    {
        DisjointSet <IGraphNode <T> > nodes = new DisjointSet <IGraphNode <T> >();

        foreach (IGraphNode <T> node in graph.Nodes)
        {
            nodes.Add(node);
        }

        PriorityQueue <QueueType> edges = new PriorityQueue <QueueType>(graph.EdgeCount);

        foreach (IGraphEdge <T> edge in graph.Edges)
        {
            edges.Add(new QueueType(edge.weight, edge));
        }

        List <IGraphEdge <T> > ret = new List <IGraphEdge <T> >(graph.NodeCount);

        while (edges.Count > 0)
        {
            IGraphEdge <T> edge = edges.Pop().Second;
            if (nodes.AreUnited(edge.node1, edge.node2))
            {
                continue;
            }
            ret.Add(edge);
            nodes.Union(edge.node1, edge.node2);
        }

        return(ret);
    }
Exemplo n.º 5
0
      public void Union(int size)
      {
          var pairs = GenerateRandomPairs(size);

          IDisjointSet actual   = new DisjointSet(size);
          IDisjointSet expected = new NaiveDisjointSet(size);

          foreach (var pair in pairs)
          {
              expected.Union(pair.Item1, pair.Item2);
              actual.Union(pair.Item1, pair.Item2);

              var expectedSets = expected.GetSets();
              var actualSets   = actual.GetSets();
              Assert.Equal(expectedSets.Length, actualSets.Length);
              foreach (var expectedSet in expectedSets)
              {
                  var actualSet = actualSets.FirstOrDefault(x => x.Contains(expectedSet[0]));
                  Assert.Equal(expectedSet.Length, actualSet.Length);
                  Assert.True(expectedSet.All(x => actualSet.Contains(x)));
              }

              Assert.Equal(expected.SetCount, actual.SetCount);
              for (int i = 0; i < size; i++)
              {
                  Assert.Equal(expected.GetSetSize(i), actual.GetSetSize(i));
                  for (int j = 0; j < size; j++)
                  {
                      Assert.Equal(expected.InSameSet(i, j), actual.InSameSet(i, j));
                  }
              }
          }
      }
Exemplo n.º 6
0
        static void Main(string[] args)
        {
            string[]            primeraLinea      = Console.ReadLine().Split();
            string[]            edades            = Console.ReadLine().Split();
            int                 acciones          = int.Parse(primeraLinea[1]);
            DisjointSet         myDisjointSet     = new DisjointSet(edades);
            LinkedList <double> respuestaAcciones = new LinkedList <double>();

            for (int veces = 0; veces < acciones; veces++)
            {
                string[] accion = Console.ReadLine().Split();
                if (accion[0].Equals("2"))
                {
                    respuestaAcciones.AddLast(myDisjointSet.Promedio(int.Parse(accion[1]) - 1));
                }
                else if (accion[0].Equals("1"))
                {
                    myDisjointSet.Merge(int.Parse(accion[1]) - 1, int.Parse(accion[2]) - 1);
                }
            }

            foreach (var el in respuestaAcciones)
            {
                Console.WriteLine("{0:f2}", el, 2);
            }
        }
        public void Basic()
        {
            var set = new DisjointSet <int>();

            set.Clear();
            foreach (int v in Enumerable.Range(1, 9))
            {
                set.Add(v);
            }
            foreach (int x in Enumerable.Range(1, 9))
            {
                foreach (int y in Enumerable.Range(1, 9))
                {
                    Assert.IsFalse(x != y && set.IsUnited(x, y));
                }
            }
            set.Unite(1, 9);
            Assert.AreEqual(set.Count, 8);
            Assert.IsTrue(set.IsUnited(1, 9));
            set.Unite(2, 7);
            Assert.AreEqual(set.Count, 7);
            Assert.AreEqual(set.ElementCount, 9);
            set.Unite(7, 1);
            Assert.IsTrue(set.IsUnited(2, 9));
            Assert.IsFalse(set.IsUnited(2, 6));

            Assert.AreEqual(set.Count, 6);
            Assert.AreEqual(set.ElementCount, 9);
        }
        public void Find_Should_FindSelf_When_SetEmpty(int size, int i)
        {
            DisjointSet disjointSet = new DisjointSet(size);
            int         actual      = disjointSet.Find(i);

            Assert.Equal(i, actual);
        }
Exemplo n.º 9
0
        public void DisjointSetFindGuardCase2Test()
        {
            DisjointSet <int> disjointSet = new DisjointSet <int>();

            disjointSet.MakeSet(1);
            var result = disjointSet.Find(2);
        }
Exemplo n.º 10
0
        public void DisjointSetPathCompressionTest()
        {
            DisjointSet <int> disjointSet = new DisjointSet <int>();

            disjointSet.MakeSet(1);
            disjointSet.MakeSet(2);
            disjointSet.MakeSet(3);
            disjointSet.MakeSet(4);
            disjointSet.MakeSet(5);
            disjointSet.MakeSet(6);
            disjointSet.MakeSet(7);
            disjointSet.MakeSet(8);
            disjointSet.Union(1, 2);
            disjointSet.Union(3, 4);
            disjointSet.Union(5, 6);
            disjointSet.Union(7, 8);
            disjointSet.Union(1, 3);
            disjointSet.Union(5, 7);
            disjointSet.Union(1, 5);
            List <int> parentList = disjointSet.GetPath(8);

            CollectionAssert.AreEqual(new int[] { 7, 5, 1 }, parentList);
            var setId = disjointSet.Find(8);

            Assert.AreEqual(1, disjointSet.GetItemCore(8).Parent);
            Assert.AreEqual(1, disjointSet.GetItemCore(7).Parent);
            Assert.AreEqual(1, disjointSet.GetItemCore(5).Parent);
        }
Exemplo n.º 11
0
        public void DisjointSetMakeSetGuardCase3Test()
        {
            DisjointSet <int> disjointSet = new DisjointSet <int>();

            disjointSet.MakeSet(1);
            disjointSet.MakeSet(1);
        }
        public void Find_ShouldReturnRoot_When_SelfNotRoot(int[] start, int findIndex, int expected)
        {
            DisjointSet disjointSet = new DisjointSet(start);
            int         actual      = disjointSet.Find(findIndex);

            Assert.Equal(expected, actual);
        }
Exemplo n.º 13
0
        static void Main(string[] args)
        {
            var ned         = Console.ReadLine().Split(' ').Select(int.Parse).ToArray();
            var quotientSet = new DisjointSet(ned[0]);

            Func <int[]> readIndices = () =>
                                       Console.ReadLine().Split(' ').Select(t => int.Parse(t) - 1).ToArray();

            for (; ned[1] > 0; --ned[1])
            {
                var indices = readIndices();
                quotientSet.Unite(indices[0], indices[1]);
            }

            var ans = 1;

            for (; ned[2] > 0; --ned[2])
            {
                var indices = readIndices();
                if (quotientSet.Find(indices[0]) == quotientSet.Find(indices[1]))
                {
                    ans = 0;
                }
            }

            Console.WriteLine("{0}", ans);
        }
Exemplo n.º 14
0
        static void Main(string[] args)
        {
            var m       = int.Parse(Console.ReadLine().Split(' ')[1]);
            var records = Console.ReadLine().Split(' ').Select(long.Parse).ToArray();
            var maximum = records.Max();
            var set     = new DisjointSet(records.Length);

            while (m > 0)
            {
                --m;
                var to   = 0;
                var from = 0;

                {
                    var toFrom = Console.ReadLine().Split(' ').Select(int.Parse).ToArray();
                    to   = toFrom[0] - 1;
                    from = toFrom[1] - 1;
                }
                to   = set.Find(to);
                from = set.Find(from);
                var recordsNumber = from == to ? records[from] : records[from] + records[to];
                maximum = Math.Max(maximum, recordsNumber);
                Console.WriteLine("{0}", maximum);

                set.Unite(to, from);
                records[set.Find(to)] = recordsNumber;
            }
        }
Exemplo n.º 15
0
    private static void TestMerge()
    {
        DisjointSet ds = new DisjointSet(10);

        AssertTrue(ds.MergeSets(0, 1));
        ds.CheckStructure();
        AssertEquals(9, ds.NumberOfSets);
        AssertTrue(ds.AreInSameSet(0, 1));

        AssertTrue(ds.MergeSets(2, 3));
        ds.CheckStructure();
        AssertEquals(8, ds.NumberOfSets);
        AssertTrue(ds.AreInSameSet(2, 3));

        AssertFalse(ds.MergeSets(2, 3));
        ds.CheckStructure();
        AssertEquals(8, ds.NumberOfSets);
        AssertFalse(ds.AreInSameSet(0, 2));

        AssertTrue(ds.MergeSets(0, 3));
        ds.CheckStructure();
        AssertEquals(7, ds.NumberOfSets);
        AssertTrue(ds.AreInSameSet(0, 2));
        AssertTrue(ds.AreInSameSet(3, 0));
        AssertTrue(ds.AreInSameSet(1, 3));
    }
Exemplo n.º 16
0
        //private void Triangulate()
        //{
        //    List<TriangulationPoint> points = new List<TriangulationPoint>();
        //    foreach (Vertex data in VertexList)
        //        points.Add(new TriangulationPoint(data.X, data.Y));
        //    PointSet set = new PointSet(points);

        //    IList<PolygonPoint> ppoint = new List<PolygonPoint>();
        //    foreach (Vertex data in VertexList)
        //        ppoint.Add(new PolygonPoint(data.X, data.Y));
        //    Polygon pol = new Polygon(ppoint);
        //    try
        //    {

        //        P2T.Triangulate(set);

        //        IList<DelaunayTriangle> triangles = set.Triangles;
        //        foreach (DelaunayTriangle angle in triangles)
        //        {
        //            FixedArray3<TriangulationPoint> point = angle.Points;
        //            EdgeList.Add(new Edge(new Vertex((int) point[0].X, (int) point[0].Y), new Vertex((int) point[1].X, (int) point[1].Y)));
        //            EdgeList.Add(new Edge(new Vertex((int) point[2].X, (int) point[2].Y), new Vertex((int) point[1].X, (int) point[1].Y)));
        //            EdgeList.Add(new Edge(new Vertex((int) point[0].X, (int) point[0].Y), new Vertex((int) point[2].X, (int) point[2].Y)));
        //            Debug.WriteLine(String.Format("X:{0}, Y:{0}", point[0].X, point[0].Y));
        //            //if (VertexList.Contains(aaa))
        //            //    Debug.WriteLine("ada yang sama");
        //        }
        //    }
        //    catch (Exception ex)
        //    {
        //        Debug.WriteLine(ex.StackTrace);
        //    }

        //}

        //public int Distance(Vertex a, Vertex b)
        //{
        //    return (int)(Math.Sqrt(Math.Pow(a.X - b.X, 2) + Math.Pow(a.Y - b.Y, 2)));
        //}
        #endregion

        #region MST With Edge

        public void GenerateKruskalMST()
        {
            ClearSolution();
            if (VertexList.Count == 0)
            {
                return;
            }

            DisjointSet <Vertex> disjointSet = new DisjointSet <Vertex>(VertexList);

            C5.IPriorityQueue <Edge> heap = new C5.IntervalHeap <Edge>(new EdgeComparer());

            foreach (Edge e in EdgeList)
            {
                heap.Add(e);
            }

            while (heap.Count > 0 && disjointSet.Count > 0)
            {
                Edge s = heap.DeleteMin();
                if (!disjointSet.IsSameSet(s.VertexFirst, s.VertexSecond))
                {
                    disjointSet.Union(s.VertexFirst, s.VertexSecond);
                    EdgeSolution.Add(s);
                }
            }
        }
        public void Compute()
        {
            // clear previous results
            SpanningTreeEdges.Clear();

            // create disjoint set object
            // fill in disjoint sets
            DisjointSet dset = new DisjointSet(VisitedGraph.Vertices);

            // create and fill in priority queue
            PriorityQueue Q = new PriorityQueue(Weights, VisitedGraph.Edges);

            // iterate over edges
            while(Q.Count!=0)
            {
                IEdge e = Q.Peek();
                Q.Pop();
                IVertex u = dset.FindSet(e.Source);
                IVertex v = dset.FindSet(e.Target);
                if ( u != v )
                {
                    SpanningTreeEdges.Add(e);
                    dset.Link(u, v);
                }
            }
        }
Exemplo n.º 18
0
    public static void Main()
    {
        DisjointSet set = new DisjointSet();

        // lets say we have 10 people, union represent who is friend with whom

        for (int i = 1; i <= 10; i++)
        {
            set.MakeSet(i);
        }
        set.Union(1, 2);
        set.Union(2, 4);
        set.Union(3, 9);
        set.Union(5, 6);
        set.Union(7, 8);
        set.Union(8, 9);
        set.Union(2, 5);

        int max = 0;

        foreach (Node n in set.map.Values)
        {
            int curMax = set.FindSet(n).setTotal;
            if (curMax > max)
            {
                max = curMax;
            }
        }

        Console.WriteLine("Max friend group size is " + max);
    }
Exemplo n.º 19
0
        public void Init(int numRow, int numCol)
        {
            /* size of maze */
            this.numRow = numRow;
            this.numCol = numCol;
            numCell     = numRow * numCol;

            ds = new DisjointSet(numCell);

            cellArr  = new int[numRow, numCol];
            hEdgeArr = new int[numRow + 1, numCol];
            vEdgeArr = new int[numRow, numCol + 1];

            /* each cell is element of disjoint set */
            int cell = 1;

            for (int i = 0; i < numRow; i++)
            {
                for (int j = 0; j < numCol; j++)
                {
                    cellArr[i, j] = cell++;
                }
            }

            /* initialize hEdgeArr and vEdgeArr */
            InitEdgeArr();

            rd = new Random();
        }
    private static void testAgainstNaiveRandomly()
    {
        int trials     = 1000;
        int iterations = 3000;
        int numElems   = 300;

        for (int i = 0; i < trials; i++)
        {
            NaiveDisjointSet nds = new NaiveDisjointSet(numElems);
            DisjointSet      ds  = new DisjointSet(numElems);
            for (int j = 0; j < iterations; j++)
            {
                int k = rand.Next(numElems);
                int l = rand.Next(numElems);
                assert(ds.GetSizeOfSet(k) == nds.GetSizeOfSet(k));
                assert(ds.AreInSameSet(k, l) == nds.AreInSameSet(k, l));
                if (rand.NextDouble() < 0.1)
                {
                    assert(ds.MergeSets(k, l) == nds.MergeSets(k, l));
                }
                assert(nds.GetNumberOfSets() == ds.GetNumberOfSets());
                if (rand.NextDouble() < 0.001)
                {
                    ds.CheckStructure();
                }
            }
            ds.CheckStructure();
        }
    }
    private static void testBigMerge()
    {
        int maxRank = 20;
        int trials  = 10000;

        int         numElems = 1 << maxRank;  // Grows exponentially
        DisjointSet ds       = new DisjointSet(numElems);

        for (int level = 0; level < maxRank; level++)
        {
            int mergeStep = 1 << level;
            int incrStep  = mergeStep * 2;
            for (int i = 0; i < numElems; i += incrStep)
            {
                assert(!ds.AreInSameSet(i, i + mergeStep));
                assert(ds.MergeSets(i, i + mergeStep));
            }
            // Now we have a bunch of sets of size 2^(level+1)

            // Do random tests
            int mask = -incrStep;              // 0b11...100...00
            for (int i = 0; i < trials; i++)
            {
                int  j      = rand.Next(numElems);
                int  k      = rand.Next(numElems);
                bool expect = (j & mask) == (k & mask);
                assert(ds.AreInSameSet(j, k) == expect);
            }
        }
    }
Exemplo n.º 22
0
    List <Edge> KruskalMST(Graph g)
    {
        EdgeComparer ec       = new EdgeComparer();
        List <Edge>  allEdges = g.allEdges;

        allEdges.Sort(ec);

        DisjointSet ds = new DisjointSet();

        foreach (Vertex v in g.allVertex.Values)
        {
            ds.MakeSet(v.id);
        }

        List <Edge> mst = new List <Edge>();

        foreach (Edge e in allEdges)
        {
            int p1 = ds.FindSet(e.v1.id);
            int p2 = ds.FindSet(e.v2.id);

            if (p1 == p2)
            {
                continue;
            }

            mst.Add(e);
            ds.Union(p1, p2);
        }

        return(mst);
    }
Exemplo n.º 23
0
        /// <summary>
        /// Connects the map areas given on the given map using the algorithm described in the class description.
        /// </summary>
        /// <param name="map">The map to connect.</param>
        /// <param name="mapAreas">The map areas to connect on the given map.</param>
        /// <param name="distanceCalc">The distance calculation that defines distance/neighbors.</param>
        /// <param name="areaConnector">
        /// The area connection strategy to use. Not all methods function on maps with concave areas
        /// -- see respective class documentation for details.
        /// </param>
        /// ///
        /// <param name="tunnelCreator">
        /// The tunnel creation strategy to use. If null is specified, DirectLineTunnelCreator with
        /// the distance calculation specified is used.
        /// </param>
        static public void Connect(ISettableMapView <bool> map, IReadOnlyList <MapArea> mapAreas, Distance distanceCalc, IAreaConnectionPointSelector areaConnector = null, ITunnelCreator tunnelCreator = null)
        {
            if (areaConnector == null)
            {
                areaConnector = new RandomConnectionPointSelector();
            }
            if (tunnelCreator == null)
            {
                tunnelCreator = new DirectLineTunnelCreator(distanceCalc);
            }

            var ds = new DisjointSet(mapAreas.Count);

            while (ds.Count > 1)             // Haven't unioned all sets into one
            {
                for (int i = 0; i < mapAreas.Count; i++)
                {
                    int iClosest = findNearestMapArea(mapAreas, distanceCalc, i, ds);

                    var connectionPoints = areaConnector.SelectConnectionPoints(mapAreas[i], mapAreas[iClosest]);

                    tunnelCreator.CreateTunnel(map, connectionPoints.Item1, connectionPoints.Item2);
                    ds.MakeUnion(i, iClosest);
                }
            }
        }
Exemplo n.º 24
0
        public KruskalMst(EdgeWeightedGraph graph)
        {
            mst = new Queue <Edge>();

            var prioryQueue = new MinPQ <Edge>();

            foreach (var edge in graph.GetEdges())
            {
                prioryQueue.Insert(edge);
            }

            var ds = new DisjointSet(graph.Vertices);

            while (!prioryQueue.IsEmpty() && mst.Count < graph.Vertices - 1)
            {
                var edge        = prioryQueue.DelMin();
                int vertex      = edge.Either();
                int otherVertex = edge.Other(vertex);

                if (ds.Connected(vertex, otherVertex))
                {
                    continue;
                }

                ds.Union(vertex, otherVertex);
                mst.Enqueue(edge);
            }
        }
Exemplo n.º 25
0
        public void Solve()
        {
            var n = sc.Integer();
            var k = sc.Integer();
            var l = sc.Integer();
            var a = new DisjointSet(n);
            var b = new DisjointSet(n);

            for (int i = 0; i < k; i++)
            {
                a.Unite(sc.Integer() - 1, sc.Integer() - 1);
            }
            for (int i = 0; i < l; i++)
            {
                b.Unite(sc.Integer() - 1, sc.Integer() - 1);
            }
            var map = new HashMap <long, int>();

            for (int i = 0; i < n; i++)
            {
                map[a[i] * 500000L + b[i]]++;
            }
            var ans = new int[n];

            for (int i = 0; i < n; i++)
            {
                ans[i] = map[a[i] * 500000L + b[i]];
            }
            IO.Printer.Out.WriteLine(ans.AsJoinedString());
        }
Exemplo n.º 26
0
    static void Main()
    {
        var points = ReadPoints();
        var k      = int.Parse(Console.ReadLine());
        var sets   = new DisjointSet <Point>(points);
        var edges  = CalculateEdges(points);

        for (var i = points.Length; i < edges.Length; i++)
        {
            var edge = edges[i];

            if (sets.Count == k)
            {
                if (sets.GetParent(edge.A).Equals(sets.GetParent(edge.B)))
                {
                    continue;
                }

                Console.WriteLine("{0:f9}", edge.Distance);
                return;
            }

            sets.Merge(edge.A, edge.B);
        }

        Console.WriteLine("0.000000000");
    }
Exemplo n.º 27
0
    static long MinSumOfWeightsInSubTree(int[] from, int[] to, int[] weight)
    {
        var edges = new List <Edge>();

        for (var i = 0; i < from.Length; i++)
        {
            var edge = new Edge(from[i], to[i], weight[i]);
            edges.Add(edge);
        }

        edges = edges.OrderBy(c => c.Weight).ToList();

        var usedNodes = new DisjointSet();

        long weightSum = 0;

        foreach (var edge in edges)
        {
            usedNodes.MakeSet(edge.From);
            usedNodes.MakeSet(edge.To);

            if (usedNodes.FindSet(edge.From) != usedNodes.FindSet(edge.To))
            {
                weightSum += edge.Weight;
                usedNodes.Union(edge.From, edge.To);
            }
        }

        return(weightSum);
    }
Exemplo n.º 28
0
        public void DisjointSetTest()
        {
            var values = new List <int>()
            {
                1, 2, 3, 4, 5, 6, 7, 8
            };
            var sets = new List <DisjointSet <int> >();

            foreach (var item in values)
            {
                var set = new DisjointSet <int>(item);
                sets.Add(set);
            }

            var unionSet = sets[0];

            for (int i = 1; i < sets.Count; i++)
            {
                unionSet = unionSet.Union(sets[i]);
            }

            var unionValues = unionSet.GetNodes();

            //如何自己实现区并集
            //如何证明两个集合值都是相等的呢?

            //这样感觉的实现是对的!
            Assert.AreEqual(values.Count, unionValues.Count());

            foreach (var item in unionValues)
            {
                Console.WriteLine(item);
                Assert.IsTrue(values.Contains(item.Value));
            }
        }
Exemplo n.º 29
0
 public DisjointSetTests()
 {
     _ds = new DisjointSet(6);
     _ds.Union(0, 3);
     _ds.Union(1, 3);
     _ds.Union(2, 4);
 }
    private static void testMerge()
    {
        DisjointSet ds = new DisjointSet(10);

        assert(ds.MergeSets(0, 1));
        ds.CheckStructure();
        assert(ds.GetNumberOfSets() == 9);
        assert(ds.AreInSameSet(0, 1));

        assert(ds.MergeSets(2, 3));
        ds.CheckStructure();
        assert(ds.GetNumberOfSets() == 8);
        assert(ds.AreInSameSet(2, 3));

        assert(!ds.MergeSets(2, 3));
        ds.CheckStructure();
        assert(ds.GetNumberOfSets() == 8);
        assert(!ds.AreInSameSet(0, 2));

        assert(ds.MergeSets(0, 3));
        ds.CheckStructure();
        assert(ds.GetNumberOfSets() == 7);
        assert(ds.AreInSameSet(0, 2));
        assert(ds.AreInSameSet(3, 0));
        assert(ds.AreInSameSet(1, 3));
    }
Exemplo n.º 31
0
        public void Solve()
        {
            var n   = sc.Integer();
            var m   = sc.Integer();
            var s   = sc.Integer() - 1;
            var ans = new List <int>();
            var G   = Enumerate(n, x => new List <int>());

            for (int i = 0; i < m; i++)
            {
                var f = sc.Integer() - 1;
                var t = sc.Integer() - 1;
                G[Math.Min(f, t)].Add(Math.Max(f, t));
            }
            var set = new DisjointSet(n);

            for (int i = n - 1; i >= 0; i--)
            {
                foreach (var to in G[i])
                {
                    set.Unite(i, to);
                }
                if (set.IsUnited(i, s))
                {
                    ans.Add(i);
                }
            }
            ans.Reverse();
            foreach (var x in ans)
            {
                IO.Printer.Out.WriteLine(x + 1);
            }
        }
Exemplo n.º 32
0
        public void MinimalSpanningTree(string filename)
        {
            Stopwatch clock = Stopwatch.StartNew();

            //Read the input file
            string[] lines = File.ReadAllLines(filename);

            //create a forest F (a set of trees),
            //where each vertex in the graph is a separate tree
            int N = lines[0].Split(',').Length;
            DisjointSet vertices = new DisjointSet(N);

            //create a set S containing all the edges in the graph
            //The tuple contains weight,vertex, vertex
            List<Tuple<int, int, int>> edges = new List<Tuple<int, int, int>>();
            int initialWeight = 0;

            for (int i = 0; i < N; i++)
            {
                string[] edge = lines[i].Split(',');

                for (int j = 0; j < i; j++)
                {
                    if (edge[j] != "-")
                    {
                        int weight = Convert.ToInt32(edge[j]);
                        edges.Add(new Tuple<int, int, int>(weight, i, j));
                        initialWeight += weight;
                    }
                }
            }

            //Sort edges to have the minimum weight at top
            edges.Sort();
            int k = 0;
            //while S is nonempty and F is not yet spanning
            int minSpanningTreeWeight = 0;
            while (!vertices.isSpanning())
            {
                //remove an edge with minimum weight from S
                //Since we have a sorted list we just go through the list

                //if that edge connects two different trees, then add it to the forest,
                //combining two trees into a single tree
                if (vertices.Find(edges[k].Item2) != vertices.Find(edges[k].Item3))
                {
                    vertices.Union(edges[k].Item2, edges[k].Item3);
                    minSpanningTreeWeight += edges[k].Item1;
                }
                k++;
            }

            clock.Stop();
            Console.WriteLine("The saving is {0} ", initialWeight - minSpanningTreeWeight);
            Console.WriteLine("Solution took {0} ms", clock.Elapsed.TotalMilliseconds);
        }
        List<Node> stable; /* Максимально стабильные области экстремума */

        #endregion Fields

        #region Constructors

        public ComponentTree(GrayscaleBitmap original)
        {
            pixels = original.DecreasingCountingSort();

            accessible = new Int32[original.Width, original.Height];

            for (Int32 i = 0; i < original.Width; i++)
            {
                for (Int32 j = 0; j < original.Height; j++)
                {
                    accessible[i, j] = Int32.MinValue;
                }
            }

            QNode = new DisjointSet(Length);
            QTree = new DisjointSet(Length);

            nodes = new Node[Length];
            lowestNode = new Int32[Length];

            stable = new List<Node>();

            MSERDetector();
        }
Exemplo n.º 34
0
        public void GenerateEuclideanKruskalMST()
        {
            if (VertexList.Count == 0)
                return;

            DateTime start = DateTime.Now;
            DisjointSet<Vertex> disjointSet = new DisjointSet<Vertex>(VertexList);
            EdgeSolution.Clear();

            C5.IPriorityQueue<Edge> heap = new C5.IntervalHeap<Edge>(new EdgeComparer());

            //Triangulate();
            //DelaunayTriangulation2d triangulator = new DelaunayTriangulation2d();
            //IList<Triangle> triangles = triangulator.Triangulate(new List<Vertex>(VertexList));

            //foreach (Triangle triangle in triangles)
            //{
            //    Edge e = new Edge(triangle.Vertex1, triangle.Vertex2);
            //    heap.Add(e);
            //    EdgeList.Add(e);
            //    e = new Edge(triangle.Vertex1, triangle.Vertex3);
            //    heap.Add(e);
            //    EdgeList.Add(e);
            //    e = new Edge(triangle.Vertex3, triangle.Vertex2);
            //    heap.Add(e);
            //    EdgeList.Add(e);

            //}
            //this.VisitedVertex = VertexList.Count;
            for (int i = 0; i < VertexList.Count - 1; i++)
                for (int j = i + 1; j < VertexList.Count; j++)
                {
                    Edge e = new Edge(VertexList[i], VertexList[j]);
                    heap.Add(e);
                }

            while (heap.Count > 0 && disjointSet.Count > 0)
            {
                Edge s = heap.DeleteMin();
                if (!disjointSet.IsSameSet(s.VertexFirst, s.VertexSecond))
                {

                    disjointSet.Union(s.VertexFirst, s.VertexSecond);
                    EdgeSolution.Add(s);
                }
            }

            Debug.WriteLine((DateTime.Now - start).TotalMilliseconds + " ms");
            //this.VisitedVertex = VertexList.Count;
        }
    void Start()
    {
        gridSize = gridCbrtSize * gridCbrtSize * gridCbrtSize;

        gridPosition = this.transform.position;
        float gridPositionAdjustment = (float)gridCbrtSize * blockSpacing / 2f;
        Debug.Log (gridPositionAdjustment);
        gridPosition.x -= gridPositionAdjustment;
        gridPosition.z -= gridPositionAdjustment;

        openState = new int[gridSize];
        visualizerBlock = new GameObject[gridSize];
        disjointSet = new DisjointSet (gridSize);
        StartCoroutine (BuildGrid ());

        // join all 'top' indices to check percolation later
        int topRowFirstIndex = (int)(gridSize / gridCbrtSize) * (gridCbrtSize-1);
        for(int i = topRowFirstIndex; i < gridSize-1; i++)
        {
            disjointSet.Join (i, gridSize-1);
        }
    }
Exemplo n.º 36
0
        public void GenerateKruskalMST()
        {
            ClearSolution();
            if (VertexList.Count == 0)
                return;

            DisjointSet<Vertex> disjointSet = new DisjointSet<Vertex>(VertexList);
            C5.IPriorityQueue<Edge> heap = new C5.IntervalHeap<Edge>(new EdgeComparer());

            foreach(Edge e in EdgeList)
                    heap.Add(e);

            while (heap.Count > 0 && disjointSet.Count > 0)
            {
                Edge s = heap.DeleteMin();
                if (!disjointSet.IsSameSet(s.VertexFirst, s.VertexSecond))
                {
                    disjointSet.Union(s.VertexFirst, s.VertexSecond);
                    EdgeSolution.Add(s);
                }
            }
        }
Exemplo n.º 37
0
        public void GenerateOurKruskalMST(int bucket, double max, double min)
        {
            if (VertexList.Count == 0)
                return;
            if (max == min)
            {
                GenerateKruskalMST();
                return;
            }

            DisjointSet<Vertex> disjointSet = new DisjointSet<Vertex>(VertexList);
            ClearSolution();
            C5.IPriorityQueue<Edge>[] bucketHeap = new C5.IntervalHeap<Edge>[bucket];

            for (int i = 0; i < bucketHeap.Length; i++)
            {
                bucketHeap[i] = new C5.IntervalHeap<Edge>(new EdgeComparer());
            }

            int factor = bucket - 1;
            double diff = max - min;

            foreach(Edge e in EdgeList)
            {
                bucketHeap[(int)Math.Floor((((e.Length - min) / (diff)) * (factor)))].Add(e);
            }

            for (int i = 0; i < bucket && disjointSet.Count > 0; i++)
            {
                while (bucketHeap[i].Count > 0 && disjointSet.Count > 0)
                {
                    Edge s = bucketHeap[i].DeleteMin();
                    if (!disjointSet.IsSameSet(s.VertexFirst, s.VertexSecond))
                    {
                        disjointSet.Union(s.VertexFirst, s.VertexSecond);
                        EdgeSolution.Add(s);
                    }
                }
            }
        }
Exemplo n.º 38
0
    private void solve()
    {
        DisjointSet ds = new DisjointSet(B - A + 1);

        for (long d = P; d < B - A; d++)
        {
            if (isPrime((int)d))
            {
                for (long i = (d - A % d) % d; d + i <= B - A; i = i + d) ds.union(i, d + i);
            }
        }

        setNumber = ds.numberOfSets();
    }
Exemplo n.º 39
0
        public void GenerateEuclideanOurKruskalMST(int bucket)
        {
            if (VertexList.Count == 0)
                return;

            DateTime start = DateTime.Now;
            DisjointSet<Vertex> disjointSet = new DisjointSet<Vertex>(VertexList);
            EdgeSolution.Clear();
            C5.IPriorityQueue<Edge>[] heap2 = new C5.IntervalHeap<Edge>[bucket];
            C5.IPriorityQueue<Edge> heap = new C5.IntervalHeap<Edge>(new EdgeComparer());
            for(int i=0;i<heap2.Length;i++)
            {
                heap2[i] = new C5.IntervalHeap<Edge>(new EdgeComparer());
            }

            //this.VisitedVertex = VertexList.Count;
            for (int i = 0; i < VertexList.Count - 1; i++)
                for (int j = i + 1; j < VertexList.Count; j++)
                {
                    Edge e = new Edge(VertexList[i], VertexList[j]);
                    heap.Add(e);
                }

            double max = heap.FindMax().Length;
            double min = heap.FindMin().Length;

            while (heap.Count > 0)
            {
                Edge s = heap.DeleteMin();
                heap2[(int) Math.Floor((((s.Length - min) / (max - min)) * (bucket-1)))].Add(s);
            }

            for (int i = 0; i < bucket && disjointSet.Count > 0; i++)
            {
                while (heap2[i].Count > 0 && disjointSet.Count > 0)
                {
                    Edge s = heap2[i].DeleteMin();
                    if (!disjointSet.IsSameSet(s.VertexFirst, s.VertexSecond))
                    {

                        disjointSet.Union(s.VertexFirst, s.VertexSecond);
                        EdgeSolution.Add(s);
                    }
                }
            }

            Debug.WriteLine((DateTime.Now - start).TotalMilliseconds + " ms");
            //this.VisitedVertex = VertexList.Count;
        }