Esempio n. 1
0
        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);
 }
Esempio n. 3
0
 public BellmanFordResult(int size)
 {
     VisitedFrom = new SearchData <int>(size, -1);
     Distance    = new SearchData <double>(size, 0);
 }