public override int[] GetPath(int n, IMeasure measure)
        {
            var baseState = new GenerationState
                {
                    C = new double[n,n],
                    Edges = new List<Edge>(n),
                    N = n,
                    VertexSet = new int[n]
                };
            baseState.C = measure.GetMatrix();
            for (int i = 0; i < n; i++)
            {
                baseState.C[i, i] = Inf;
            }
            baseState.J = ReductMatrix(n, baseState.C);
            for (int i = 0; i < n; i++)
            {
                baseState.VertexSet[i] = i;
            }

            var queue = new PriorityQueue<GenerationState>((a, b) => -a.J.CompareTo(b.J));
            queue.Enqueue(baseState);

            while (queue.Count > 0)
            {
                var current = queue.Dequeue();

                if (current.Edges.Count == n - 1)
                {
                    var result = GetResult(n, current.Edges);
                    return result;
                }

                Process(current, queue);
            }

            throw new ApplicationException("Path not found");
        }