Example #1
0
        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()]);
                }
            }
        }