コード例 #1
0
        public AcyclicSP(EdgeWeightedDigraph G)
        {
            edgeTo = new DirectedEdge[G.VNumber()];
            distTo = new double[G.VNumber()];
            for (int v = 0; v < G.VNumber(); v++)
            {
                distTo[v] = Double.PositiveInfinity;
            }
            Topological top = new Topological(G);

            /*起先并不知道图的拓扑排序顺序,因此无法得知起点位置,
             * 因此引入计数器n,判定拓扑排序起点,并将起点的distTo[]设置为0。
             */
            int n = 0;

            foreach (int v in top.Order())
            {
                if (n == 0)
                {
                    distTo[v] = 0.0;
                }
                Relax(G, v);
                n++;
            }
        }
コード例 #2
0
 public DirectedCycle(EdgeWeightedDigraph G)
 {
     onStack = new bool[G.VNumber()];
     edgeTo  = new int[G.VNumber()];
     marked  = new bool[G.VNumber()];
     for (int v = 0; v < G.VNumber(); v++)
     {
         if (!marked[v])
         {
             Dfs(G, v);
         }
     }
 }
コード例 #3
0
 public DepthFirstOrder(EdgeWeightedDigraph G)
 {
     pre         = new Queue <int>();
     post        = new Queue <int>();
     reversePost = new Stack <int>();
     marked      = new bool[G.VNumber()];
     for (int v = 0; v < G.VNumber(); v++)
     {
         if (!marked[v])
         {
             Dfs(G, v);
         }
     }
 }
コード例 #4
0
 public DijkstraSP(EdgeWeightedDigraph G, int s)
 {
     edgeTo = new DirectedEdge[G.VNumber()];
     distTo = new double[G.VNumber()];
     pq     = new IndexMinPQ <double>(G.VNumber());
     for (int v = 0; v < G.VNumber(); v++)
     {
         distTo[v] = Double.PositiveInfinity;
     }
     distTo[s] = 0.0;
     pq.Insert(s, 0.0);
     while (!pq.IsEmpty())
     {
         Relax(G, pq.DelMin());
     }
 }
コード例 #5
0
 private Stack <int> cycle;      //edgeTo[]中的是否有负权重环
 public BellmanFordSP(EdgeWeightedDigraph G, int s)
 {
     distTo = new double[G.VNumber()];
     edgeTo = new DirectedEdge[G.VNumber()];
     onQ    = new bool[G.VNumber()];
     queue  = new Queue <int>();
     for (int v = 0; v < G.VNumber(); v++)
     {
         distTo[v] = Double.PositiveInfinity;
     }
     distTo[s] = 0.0;
     queue.enqueue(s);
     onQ[s] = true;
     while (!queue.IsEmpty() && !HasNegativeCycle())
     {
         int v = queue.dequeue();
         onQ[v] = false;
         Relax(G, v);
     }
 }
コード例 #6
0
 private void Relax(EdgeWeightedDigraph G, int v)
 {
     foreach (DirectedEdge e in G.Adj(v))
     {
         int w = e.To();
         if (distTo[w] > distTo[v] + e.Weight())
         {
             distTo[w] = distTo[v] + e.Weight();
             edgeTo[w] = e;
             if (!onQ[w])
             {
                 queue.enqueue(w);
                 onQ[w] = true;
             }
         }
         if (cost++ % G.VNumber() == 0)
         {
             FindNegativeCycle();//寻找有向图中是否有负权重环,以保证循环能够结束
         }
     }
 }