public DijkstraSP(EdgeWeightedDigraph G, int s) { foreach (DirectedEdge e in G.GetEdges()) { if (e.GetWeight() < 0) { throw new ArgumentException("Negative weight"); } } distTo = new double[G.GetVertices()]; edgeTo = new DirectedEdge[G.GetVertices()]; ValidateVertex(s); for (int v = 0; v < G.GetVertices(); v++) { distTo[v] = double.PositiveInfinity; } distTo[s] = 0.0; // relax vertices in order of distance from s Comparer <double> comparer = Comparer <double> .Default; pq = new IndexMinPQ <Double>(G.GetVertices(), comparer); pq.Insert(s, distTo[s]); while (!pq.IsEmpty()) { pq.DelMin(out int index, out double key); int v = index; foreach (DirectedEdge e in G.GetAdj(v)) { Relax(e); } } }
// relax edge e and update pq if changed private void Relax(DirectedEdge e) { int v = e.From(), w = e.To(); if (distTo[w] > distTo[v] + e.GetWeight()) { distTo[w] = distTo[v] + e.GetWeight(); edgeTo[w] = e; if (pq.Contains(w)) { pq.DecreaseKey(w, distTo[w]); } else { pq.Insert(w, distTo[w]); } } }
public HeapIterator(Comparer <Key> Comparer, int Size, int N, int[] indexes, Key[] keys) { this.Comparer = Comparer; this.Size = Size; this.N = N; this.Keys = keys; if (Comparer == null) { copy = new IndexMinPQ <Key>(Size, Comparer); } else { copy = new IndexMinPQ <Key>(Size, Comparer); } for (int i = 0; i <= N; i++) { copy.Insert(indexes[i], this.Keys[i]); } }