void Dfs(EdgeWeightedDirectedGraph g, int v) { onStack[v] = true; marked[v] = true; foreach (var i in g.Adj(v)) { int end = i.End; if (HasCircle()) { return; } else if (!marked[i.Start]) { edgeTo[end] = i; } else if (onStack[end]) { circle = new Stack <DirectedEdge>(); DirectedEdge f = i; while (f.Start != end) { circle.Push(f); f = edgeTo[f.Start]; } circle.Push(f); return; } } onStack[v] = false; }
void Relax(EdgeWeightedDirectedGraph graph, int start) { foreach (var directedEdge in graph.Adj(start)) { int end = directedEdge.End; if (DistTo[end] > DistTo[start] + directedEdge.Weight) { DistTo[end] = DistTo[start] + directedEdge.Weight; EdgeTo[end] = directedEdge; } } }
void Relax(EdgeWeightedDirectedGraph graph, int vertex) { foreach (var edge in graph.Adj(vertex)) { int v2 = edge.End; if (DistTo[v2] > DistTo[vertex] + edge.Weight) { DistTo[v2] = DistTo[vertex] + edge.Weight; EdgeTo[v2] = edge; } } }
void Relax(EdgeWeightedDirectedGraph graph, int vertex) { foreach (var edge in graph.Adj(vertex)) { int v2 = edge.End; if (DistTo[v2] > DistTo[vertex] + edge.Weight) { DistTo[v2] = DistTo[vertex] + edge.Weight; EdgeTo[v2] = edge; if (pq.Contains(v2)) { pq.Change(v2, DistTo[v2]); } pq.Insert(v2, DistTo[v2]); } } }
public void Relax(EdgeWeightedDirectedGraph graph, int v) { foreach (var edge in graph.Adj(v)) { int end = edge.End; if (DistanceTo[end] > DistanceTo[v] + edge.Weight) { DistanceTo[end] = DistanceTo[v] + edge.Weight; EdgeTo[end] = edge; if (!OnQueue[end]) { Queue.Enqueue(end); OnQueue[end] = true; } } if (Cost++ % graph.VertexCount == 0) { FindNegativeCircle(); } } }