示例#1
0
 private void dfs(int v, DirectedWeightedEdgeGraph G)
 {
     marked[v]  = true;
     onstack[v] = true;
     foreach (var e in G.GetAdj(v))
     {
         var w = e.To();
         if (cycle != null)
         {
             return;
         }
         else if (!marked[w])
         {
             edgeTo[w] = e;
             dfs(w, G);
         }
         else if (onstack[w])
         {
             cycle = new Stack <DirectedWeightedEdge>();
             for (var ee = e; ee.From() != w; ee = edgeTo[e.From()])
             {
                 cycle.Push(e);
             }
             cycle.Push(e);
         }
     }
     onstack[v] = false;
 }
示例#2
0
        public AcyclicSP(DirectedWeightedEdgeGraph G, int s)
        {
            //从加权有向图中获取它的有向图,以供拓扑排序用
            tmpG = new DirectGraph(G.GetV());
            for (int v = 0; v < G.GetV(); v++)
            {
                foreach (var e in G.GetAdj(v))
                {
                    int to = e.To();
                    tmpG.AddAdj(v, to);
                }
            }

            int V = G.GetV();

            edgeTo = new DirectedWeightedEdge[V];
            distTo = new double[V];
            for (int i = 0; i < V; i++)
            {
                distTo[i] = double.MaxValue;
            }

            distTo[s] = 0.0;
            Topological top = new Topological(tmpG);

            foreach (var v in top.Order)
            {
                relax(G, v);
            }
        }
示例#3
0
 protected void relax(DirectedWeightedEdgeGraph G, int v)
 {
     foreach (var e in G.GetAdj(v))
     {
         int w = e.To();
         if (distTo[w] > e.GetWeight() + distTo[v])
         {
             edgeTo[w] = e;
             distTo[w] = e.GetWeight() + distTo[v];
         }
     }
 }
示例#4
0
 private void relax(int v, DirectedWeightedEdgeGraph G)
 {
     foreach (var e in G.GetAdj(v))
     {
         int w = e.To();
         if (distTo[w] > distTo[v] + e.GetWeight()) //到w的已有距离大于新节点到他的距离+新节点已有的距离
         {
             distTo[w] = distTo[v] + e.GetWeight(); //放松操作
             edgeTo[w] = e;
             if (dic.ContainsKey(w))
             {
                 dic[w] = distTo[w];                    //保存下来
             }
             else
             {
                 dic.Add(w, distTo[w]);
             }
         }
     }
 }
示例#5
0
        private void relax(int v, DirectedWeightedEdgeGraph G)
        {
            foreach (var e in G.GetAdj(v))
            {
                int w = e.To();
                if (disTo[w] > disTo[v] + e.GetWeight())
                {
                    disTo[w] = disTo[v] + e.GetWeight();
                    edges[w] = e;

                    if (!inQueue[w])
                    {
                        inQueue[w] = true;
                        queue.Enqueue(w);
                    }
                }

                if (cost++ % G.GetV() == 0)
                {
                    findNegativeCycle();
                }
            }
        }