public DijkstraSP(EdgeWeightDirectedGraph g, int s) { m_edgeTo = new DirectedEdge[g.V()]; m_distTo = new double[g.V()]; m_pq = new IndexMinHeap <double>(g.V()); for (int v = 0; v < g.V(); ++v) { m_distTo[v] = Double.PositiveInfinity; } m_distTo[s] = 0; m_pq.insert(s, 0); while (!m_pq.isEmpty()) { Relax(g, m_pq.delMin()); } }
void Relax(EdgeWeightDirectedGraph g, int v) { foreach (var e in g.Adj(v)) { int w = e.To(); if (m_distTo[w] > m_distTo[v] + e.Weight()) { m_distTo[w] = m_distTo[v] + e.Weight(); m_edgeTo[w] = e; if (m_pq.contains(w)) { m_pq.change(w, m_distTo[w]); } else { m_pq.insert(w, m_distTo[w]); } } } }