private Path BuildPathToDestination()
        {
            List<PathVertex> vertices = new List<PathVertex>();

            if (destination != null)
            {
                var vertex = new PathVertex(destination, 0);

                while (vertex != null)
                {
                    vertices.Add(vertex);
                    vertex = P[vertex.Hex];
                }

                vertices.Reverse();

                return new Path(vertices);
            }
            else
                return new Path();
        }
        private bool Find()
        {
            for (int i = 0; i < map.Count - 1; i++)
            {
                Hex v = PriorityGetMin();
                H[v] = v;

                foreach (var u in v.Neighbors)
                {
                    if (!H.ContainsKey(u))
                    {
                        if (!D.ContainsKey(u))
                        {
                            D[u] = UNDEFINED;
                            PriorityInsert(u, UNDEFINED);
                        }

                        var cost = GetCost(v, u);

                        if (D[v] + cost < D[u])
                        {
                            D[u] = D[v] + cost;
                            PriorityDecrease(u, D[u]);
                            P[u] = new PathVertex(v, cost);
                        }
                    }
                }
            }

            return destination == null || P.ContainsKey(destination);
        }