private void Dfs(IEdgeWeightedDIgraph g, int v) { onStack[v] = true; marked[v] = true; foreach (var e in g.Adj(v)) { int w = e.To; if (HasCycle()) { return; } else if (!marked[w]) { edgeTo[w] = e; Dfs(g, w); } else if (onStack[w]) { cycle = new Stack <IDirectedEdge>(); var x = e; for (; x.From != w; x = edgeTo[x.From]) { cycle.Push(x); } cycle.Push(x); } } onStack[v] = false; }
private void Relax(IEdgeWeightedDIgraph g, int v) { foreach (var 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; } } }
public Topological(IEdgeWeightedDIgraph G) { IDiGraph g = new DiGraph(G.V); for (int i = 0; i < G.V; i++) { foreach (var e in G.Adj(i)) { g.AddEdge(e.From, e.To); } } Order = Init(g); }
private void Relax(IEdgeWeightedDIgraph g, int v) { foreach (var 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 (pq.Contains(w)) { pq.ChangeKey(w, distTo[w]); } else { pq.Insert(w, distTo[w]); } } } }
private void Relax(IEdgeWeightedDIgraph g, int v) { foreach (var 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.V == 0) { FindNegativeCycle(); } } }