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
 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());
     }
 }
    public PrimMST(EdgeWeightedGraph g)
    {
        m_edgeTo = new Edge[g.V()];
        m_distTo = new double[g.V()];
        m_marked = new bool[g.V()];
        for (int v = 0; v < g.V(); ++v)
        {
            m_distTo[v] = Double.PositiveInfinity;
        }
        m_pq = new IndexMinHeap <double>(g.V());

        m_distTo[0] = 0.0d;
        m_pq.insert(0, 0.0d);
        while (!m_pq.isEmpty())
        {
            Visit(g, m_pq.delMin());
        }
    }
예제 #4
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]);
             }
         }
     }
 }