public void Build() { if (_edges != null) { return; } _edges = new List <GraphEdge>(); if (_nodes.Length == 0) { return; } SolverNode bestSolverNode = null; SolverNode root = new SolverNode(_nodes); NodeStack <SolverNode> solverNodes = new NodeStack <SolverNode>(); solverNodes.Push(root); while (solverNodes.size > 0) { SolverNode currentSolverNode = solverNodes.Pop(); if (currentSolverNode.IsComplete) { if (bestSolverNode == null || bestSolverNode.CompareTo(currentSolverNode) > 0) { bestSolverNode = currentSolverNode; } } else { (SolverNode withEdge, SolverNode withoutEdge) = currentSolverNode.Split(); if (withEdge != null) { solverNodes.InsertIf(withEdge, (x) => { return(withEdge.CompareTo(x) <= 0); }); } if (withoutEdge != null) { solverNodes.InsertIf(withoutEdge, (x) => { return(withoutEdge.CompareTo(x) <= 0); }); } } } _edges = bestSolverNode.Edges; }