/// <summary> /// Finds the shortest path between the specified nodes and returns it as a list of nodes. /// </summary> /// <param name="start">The starting node for the path</param> /// <param name="end">The ending node for the path</param> /// <returns>The path, represented as a list of nodes beginning with start and ending with end.</returns> public List <Node> FindPath(Node start, Node end) { BinaryHeap path = new BinaryHeap(Nodes.Length); foreach (Node n in Nodes) { n.NodeCost = double.PositiveInfinity; n.Predecessor = null; } start.NodeCost = 0; foreach (Node n in Nodes) { path.Add(n, n.NodeCost); } Node j, k; double newCost; while (path.Count != 0) { j = path.ExtractMin(); if (j == end) { List <Node> Path = new List <Node>(); while (j != null) { Path.Add(j); j = j.Predecessor; } Path.Reverse(); return(Path); } foreach (UndirectedEdge e in j.Edges) { k = e.OtherNode(j); newCost = j.NodeCost + e.Cost; if (newCost < k.NodeCost) { path.DecreasePriority(k, newCost); k.NodeCost = newCost; k.Predecessor = j; } } } return(null); }
/// <summary> /// Finds the shortest path between the specified nodes and returns it as a list of nodes. /// </summary> /// <param name="start">The starting node for the path</param> /// <param name="end">The ending node for the path</param> /// <returns>The path, represented as a list of nodes beginning with start and ending with end.</returns> public List <Node> FindPath(Node start, Node end) { BinaryHeap pq = new BinaryHeap(Nodes.Length); foreach (Node n in Nodes) { if (n == start) { n.NodeCost = 0; } else { n.NodeCost = Double.PositiveInfinity; } n.Predecessor = null; pq.Add(n, n.NodeCost); } while (pq.Count != 0) { Node n = pq.ExtractMin(); if (n == end) { break; } foreach (UndirectedEdge v in n.Edges) { Node temp; if (v.A == n) { temp = v.B; } else { temp = v.A; } double w = v.Cost; double newCost = w + n.NodeCost; if (newCost < temp.NodeCost) { pq.DecreasePriority(temp, newCost); temp.NodeCost = newCost; temp.Predecessor = n; } } } Stack <Node> s = new Stack <Node>(); Node t = end; s.Push(t); while (t.Predecessor != null) { s.Push(t.Predecessor); t = t.Predecessor; } List <Node> l = new List <Node>(); while (s.Count != 0) { l.Add(s.Pop()); } return(l); }