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; }
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); } }
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]; } } }
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]); } } } }
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(); } } }