Exemplo n.º 1
0
        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;
        }