예제 #1
0
 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());
     }
 }
예제 #2
0
 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]);
             }
         }
     }
 }