private IEnumerable <NodeToNodeEdge> GetDistinctEdges() { var distinctEdges = new List <NodeToNodeEdge>(); var nodes = _mapProvider.GetAllNodes(); foreach (var node in nodes) { var edges = node.Edges .Select(e => new NodeToNodeEdge(node.Id, e.EndNode)); foreach (var edge in edges) { if (!distinctEdges.Any(e => e.Equals(edge))) { distinctEdges.Add(edge); } } } return(distinctEdges); }
/// <summary> /// Returns a dictionary where each Key is a Node on the map with its closest predecessor as value. /// </summary> private Dictionary <Node, Node> FindAllPaths(int startNodeId) { Node startNode = _mapProvider.GetNode(startNodeId); // Initialize sets ready for walking var queue = new List <Node>() { startNode }; var distances = new Dictionary <Node, int>() { { startNode, 0 } }; var predecessors = new Dictionary <Node, Node>(); var unvisited = _mapProvider.GetAllNodes() .Except(new [] { startNode }).ToList(); IEnumerable <Edge> GetUnvisitedEdges(Node node) => node.Edges .Where(edge => unvisited.Any(visitedNode => edge.EndNode == visitedNode.Id)); Node GetNearestNodeInQueue() => queue.OrderBy(node => distances[node]) .First(); while (queue.Any()) { var currentNode = GetNearestNodeInQueue(); queue.Remove(currentNode); var currentDistance = distances[currentNode]; var unvisitedEdges = GetUnvisitedEdges(currentNode); foreach (var edge in unvisitedEdges) { var unvisitedEndPoint = _mapProvider.GetNode(edge.EndNode); queue.Add(unvisitedEndPoint); distances.Add(unvisitedEndPoint, currentDistance + edge.Distance); predecessors.Add(unvisitedEndPoint, currentNode); unvisited.Remove(unvisitedEndPoint); } } return(predecessors); }