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);