private double SafeCost(Node destination, CostStrategy strategy)
        {
            var result = Cost(destination, NoVisitedNodes(), strategy);

            if (result == Unreachable)
            {
                throw new InvalidOperationException("Unreachable destination");
            }
            return(result);
        }
 internal double Cost(Node destination, List <Node> visitedNodes, CostStrategy strategy)
 {
     if (this == destination)
     {
         return(0);
     }
     if (visitedNodes.Contains(this))
     {
         return(Unreachable);
     }
     if (this._links.Count == 0)
     {
         return(Unreachable);
     }
     return(_links
            .ConvertAll(link => link.Cost(destination, CopyWithThis(visitedNodes), strategy))
            .Min());
 }
 internal double Cost(Node destination, List <Node> visitedNodes, CostStrategy strategy)
 {
     return(_target.Cost(destination, visitedNodes, strategy) + strategy(_cost));
 }