private void Explore(int start) { _visitedFrom = new SearchData <int>(_graph.Size(), -1); _distance = new SearchData <int>(_graph.Size(), MaxDistance); _distance.SetValue(start, 0); //Make Prioirty Queue var pq = new MinPriorityQueue <long>(_graph.Size(), long.MaxValue); for (var i = 0; i < _distance.Length; i++) { pq.Enqueue(i, _distance.GetValue(i)); } while (!pq.IsEmpty()) { //Console.WriteLine("Queue: {0}", pq); var currentIndex = pq.Dequeue(); //Console.WriteLine("Extract: {0}", currentIndex); foreach (var edge in _graph.Neighbors(currentIndex)) { var neighborIndex = edge.Right; var d = _distance.GetValue(neighborIndex); var dFromC = _distance.GetValue(currentIndex) == MaxDistance ? MaxDistance : _distance.GetValue(currentIndex) + (int)edge.Weight; //Console.WriteLine("Edge {1} => {0} : Distance {2} : {3}",neighborIndex,currentIndex,dFromC,d); if (d <= dFromC) { continue; } //Set New Distance Values _distance.SetValue(neighborIndex, dFromC); _visitedFrom.SetValue(neighborIndex, currentIndex); pq.ChangePriority(neighborIndex, dFromC); } } }
public BellmanFordResult(int size) { VisitedFrom = new SearchData <int>(size, -1); Distance = new SearchData <long>(size, PositiveInfinity); }
public BellmanFordResult(int size) { VisitedFrom = new SearchData <int>(size, -1); Distance = new SearchData <double>(size, 0); }