private static double MinPrice(ImmutableHashSet <Node> nodesIn, Graph graph,
                                       ImmutableHashSet <Node> prohibitedNodes, int setSize)
        {
            ImmutableDictionary <Node, double> priceOfNode = ImmutableDictionary <Node, double> .Empty;
            var usedNodes = nodesIn.Union(prohibitedNodes);

            foreach (var node in nodesIn)
            {
                var price = 0.0;
                foreach (var adjacentNode in nodesIn)
                {
                    if (!node.Equals(adjacentNode))
                    {
                        price += graph.Weights[node][adjacentNode];
                    }
                }

                price += graph.Weights[node].RemoveKeys(usedNodes).Values.PartialSort(setSize - nodesIn.Count).Sum();

                priceOfNode = priceOfNode.Add(node, price);
            }
            foreach (var graphNode in graph.Nodes)
            {
                if (!usedNodes.Contains(graphNode))
                {
                    var price = 0.0;
                    foreach (var adjacentNode in nodesIn)
                    {
                        price += graph.Weights[graphNode][adjacentNode];
                    }
                    if (setSize > nodesIn.Count)
                    {
                        price += graph.Weights[graphNode].RemoveKeys(usedNodes).Values.PartialSort(setSize - nodesIn.Count - 1).Sum();
                    }

                    priceOfNode = priceOfNode.Add(graphNode, price);
                }
            }

            double inPrice   = nodesIn.Sum(n => priceOfNode[n]) / 2.0;
            double restPrice = priceOfNode.RemoveRange(nodesIn).Values.PartialSort(setSize - nodesIn.Count).Sum() / 2.0;

            return(inPrice + restPrice);
        }
 public int Sum() => Elements.Sum(e => e.Value);