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); }