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++; } }
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); } } }
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); } } }
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()); } }
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); } }
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();//寻找有向图中是否有负权重环,以保证循环能够结束 } } }