private Dictionary <MapNode, double> GetWeightedMapNodeDistances(Board board, MapNode source, AllianceScenario allianceScenario) { Unit unit = board.OccupiedMapNodes[source]; TerritoryStrengths territoryStrengths = new TerritoryStrengths(); territoryStrengths.Init(board); Func <UndirectedEdge <MapNode>, double> WeightFunction = (edge) => { double powerCount = territoryStrengths.GetPowerCount(edge.Target.Territory, unit.Power); double totalAnimosity = allianceScenario.OutEdges(unit.Power) .Where(e => territoryStrengths.GetStrength(edge.Target.Territory, e.Target) > 0) .Sum(e => e.Animosity); return(1 + (powerCount - totalAnimosity)); }; var alg = new UndirectedDijkstraShortestPathAlgorithm <MapNode, UndirectedEdge <MapNode> >(unit.MyMap, WeightFunction); alg.SetRootVertex(source); _predecessorObserver.VertexPredecessors.Clear(); using (var foo = _predecessorObserver.Attach(alg)) { alg.Compute(); } return(alg.Distances); }