/// <summary> /// Constructor just construct, to cluster, call on the KMinKruskal Method. /// </summary> /// <param name="points"> /// A list of objects defined with the Point interface. /// </param> /// <param name="ClusterMaxSize"> /// A integer that limit the size of the maximum cluster. /// </param> public KMinSpanningTree(Point[] points, int ClusterMaxSize = -1) { Idx_V = new SortedDictionary <int, Point>(); E = new SortedSet <Edge>(); // Whther the edge is included in the MSt or not. V_Idx = new Dictionary <Point, int>(); // hashed, order is lost in the reverse map. // Chosen E established in EstablisheMST method. for (int I = 0; I < points.Length; I++) { Idx_V[I] = points[I]; // index to vertex V_Idx[points[I]] = I; // reverse map } // Parallel { EdgesBuffers Buffer = new EdgesBuffers(E); Parallel.For(0, points.Length, I => { for (int J = I + 1; J < points.Length; J++) { Buffer.LockAdd(new Edge(points[I], points[J])); } }); } if (ClusterMaxSize != -1) { this.ClusterSizeThreshold = ClusterMaxSize; } else { Threshold = (int)(Idx_V.Count / 2.0); // Default is 2 partition. } }
public FullGraph(Point[] points) { V = new SortedDictionary <int, Point>(); E = new SortedSet <Edge>(); // Whther the edge is included in the MSt or not. W = new Dictionary <Point, int>(); // hashed, order is lost in the reverse map. // Chosen E established in EstablisheMST method. for (int I = 0; I < points.Length; I++) { V[I] = points[I]; // index to vertex W[points[I]] = I; // reverse map } // Parallel { EdgesBuffers Buffer = new EdgesBuffers(E); Parallel.For(0, points.Length, I => { for (int J = I + 1; J < points.Length; J++) { Buffer.LockAdd(new Edge(points[I], points[J])); } }); } max_partition = EstablishMST(); }