public IEnumerable <DirectedEdge> PathTo(int v) { if (!HasPathTo(v)) { return(null); } Stack <DirectedEdge> path = new Stack <DirectedEdge>(); for (DirectedEdge e = m_edgeTo[v]; e != null; e = m_edgeTo[e.From()]) { path.Push(e); } return(path); }
/// <summary> /// relax edge e, but update if you find a *longer* path /// </summary> /// <param name="e"></param> private void Relax(DirectedEdge e) { int v = e.From(), w = e.To(); if (_distTo[w] < _distTo[v] + e.Weight) { _distTo[w] = _distTo[v] + e.Weight; _edgeTo[w] = e; } }
/// <summary> /// Adds the directed edge <tt>e</tt> to the edge-weighted digraph (if there /// is not already an edge with the same endpoints). /// </summary> /// <param name="e">e the edge</param> public void AddEdge(DirectedEdge e) { var v = e.From(); var w = e.To(); if (_adj[v][w] != null) return; E++; _adj[v][w] = e; }
private void TraceBackDirectedCycle(DirectedEdge e, int w) { _cycle = new Collections.Stack<DirectedEdge>(); while (e.From() != w) { _cycle.Push(e); e = _edgeTo[e.From()]; } _cycle.Push(e); }
/// <summary> /// relax edge e and update pq if changed /// </summary> /// <param name="e"></param> private void Relax(DirectedEdge e) { int v = e.From(), w = e.To(); if (_distTo[w] > _distTo[v] + e.Weight) { _distTo[w] = _distTo[v] + e.Weight; _edgeTo[w] = e; if (_pq.Contains(w)) _pq.DecreaseKey(w, _distTo[w]); else _pq.Insert(w, _distTo[w]); } }
public void AddEdge(DirectedEdge e) { m_adj[e.From()].Add(e); m_e++; }
/// <summary> /// Adds the directed edge <tt>e</tt> to this edge-weighted digraph. /// </summary> /// <param name="e">e the edge</param> /// <exception cref="IndexOutOfRangeException">unless endpoints of edge are between 0 and V-1</exception> public void AddEdge(DirectedEdge e) { var v = e.From(); var w = e.To(); ValidateVertex(v); ValidateVertex(w); _adj[v].Add(e); E++; }