public virtual void AddEdge(DirectedWeightedEdge <V> edge) { V start = edge.From; V end = edge.To; List <DirectedWeightedEdge <V> > edgeList = null; if (!_adjacencyList.TryGetValue(start.GetHashCode().ToString(), out edgeList)) { _adjacencyList[start.GetHashCode().ToString()] = new List <DirectedWeightedEdge <V> >(); } _adjacencyList[start.GetHashCode().ToString()].Add(edge); }
private void Relax(DirectedWeightedEdge <V> edge) { var start = edge.From; var end = edge.To; if (_distanceTo[end.GetHashCode()] > _distanceTo[start.GetHashCode()] + edge.Weight) { _distanceTo[end.GetHashCode()] = _distanceTo[start.GetHashCode()] + edge.Weight; _edgeTo[end.GetHashCode()] = edge; // TODO: Update end with the _distanceTo[end.GetHashCode()] // so that it can used in the PQ (it is the priority of the vertex that is used for swim or sink) if (_indexedPQ.Contains(end.GetHashCode())) { _indexedPQ.DecreaseKey(end.GetHashCode(), _distanceTo[end.GetHashCode()]); } else { _indexedPQ.Insert(end.GetHashCode(), _distanceTo[end.GetHashCode()]); } } }