Пример #1
0
        /// <summary>
        /// Remove a distance object from priority queue
        /// </summary>
        /// <returns>Distance object that is removed</returns>
        public distance Dequeue()
        {
            //Assumes pq isn't empty
            int      li        = data.Count - 1;
            distance frontItem = data[0];

            data[0] = data[li];
            data.RemoveAt(li);

            --li;
            int pi = 0;

            while (true)
            {
                int ci = pi * 2 + 1;
                if (ci > li)
                {
                    break;
                }
                int rc = ci + 1;
                if (rc <= li && data[rc].dist.CompareTo(data[ci].dist) < 0)
                {
                    ci = rc;
                }
                if (data[pi].dist.CompareTo(data[ci].dist) <= 0)
                {
                    break;
                }
                distance tmp = data[pi];
                data[pi] = data[ci];
                data[ci] = tmp;
                pi       = ci;
            }
            return(frontItem);
        }
Пример #2
0
        /// <summary>
        /// Add a distance object to priority queue
        /// </summary>
        /// <param name="item">Distance object</param>
        public void Enqueue(distance item)
        {
            data.Add(item);
            int ci = data.Count - 1;

            while (ci > 0)
            {
                int pi = (ci - 1) / 2;
                if (data[ci].dist.CompareTo(data[pi].dist) >= 0)
                {
                    break;
                }
                distance tmp = data[ci];
                data[ci] = data[pi];
                data[pi] = tmp;
                ci       = pi;
            }
        }