private void PostProcessSmallComponents(Edge[] edges, DisjointSet segmentedSet, int minSize)
 {
     for (int i = 0; i < edges.Length; i++)
     {
         int a = segmentedSet.Find(edges[i].A);
         int b = segmentedSet.Find(edges[i].B);
         if ((a != b) && ((segmentedSet.Size(a) < minSize) || (segmentedSet.Size(b) < minSize)))
         {
             segmentedSet.Join(a, b);
         }
     }
 }
        private DisjointSet SegmentOnDisjointSet(double k, int vertices, Edge[] edges)
        {
            DisjointSet disjointSet = new DisjointSet(vertices);

            //начальные значения устанавливаются в k, поскольку по формулам должно быть k/claster_size
            //claster size начальное равно 1
            double[] threshold = Enumerable.Range(0, vertices)
                                 .Select(el => k)
                                 .ToArray();


            // for each edge, in non-decreasing weight order...
            for (int i = 0; i < edges.Length; i++)
            {
                if (i % 100000 == 0)
                {
                    System.Diagnostics.Debug.WriteLine("itaration: " + i);
                }

                Edge edge = edges[i];

                // components conected by this edge
                int a = disjointSet.Find(edge.A);
                int b = disjointSet.Find(edge.B);
                if (a != b)
                {
                    if ((edge.w <= threshold[a]) && (edge.w <= threshold[b]))
                    {
                        disjointSet.Join(a, b);

                        a            = disjointSet.Find(a);
                        threshold[a] = edge.w + k / disjointSet.Size(a);
                    }
                }
            }

            return(disjointSet);
        }