void Visit(EdgeWeightedGraph g, int v)
 {
     m_marked[v] = true;
     foreach (var e in g.Adj(v))
     {
         int w = e.Other(v);
         if (m_marked[w])
         {
             continue;
         }
         if (e.Weight() < m_distTo[w])
         {
             m_edgeTo[w] = e;
             m_distTo[w] = e.Weight();
             if (m_pq.contains(w))
             {
                 m_pq.change(w, m_distTo[w]);
             }
             else
             {
                 m_pq.insert(w, m_distTo[w]);
             }
         }
     }
 }
예제 #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]);
             }
         }
     }
 }