예제 #1
0
        /// <summary>
        /// Добавляет новый элемент в кучу.
        /// </summary>
        public void Insert(int x)
        {
            var a = new NodeTree(x)
            {
                Degree = 0,
                Parent = null,
                Mark   = false,
            };

            if (this.Min == null)
            {
                this.Roots.Add(a);
                this.Min = a;
            }
            else
            {
                this.Roots.Add(a);
                if (x < this.Min.NodeData)
                {
                    this.Min = a;
                }
            }

            NodesCount++;
        }
예제 #2
0
 public void Cut(NodeTree x, NodeTree y)
 {
     y.Childrens.Remove(x);
     y.Degree--;
     Roots.Add(x);
     x.Parent = null;
     x.Mark   = false;
 }
예제 #3
0
 public void FibLink(FibHeap H, NodeTree y, NodeTree x)
 {
     H.Roots.Remove(y);
     x.Childrens.AddLast(y);
     y.Parent = x;
     x.Degree++;
     y.Mark = false;
 }
예제 #4
0
        public void Consolidate(FibHeap H)
        {
            var maxDegree = Convert.ToInt32(Math.Log10(NodesCount)) + 2;
            var A         = new NodeTree[maxDegree];

            for (int i = 0; i < maxDegree; i++)
            {
                A[i] = null;
            }

            var rootsCount = Roots.Count;
            var tmpRoots   = new List <NodeTree>(this.Roots);

            for (int i = 0; i < tmpRoots.Count; i++)
            {
                var x = tmpRoots[i];
                var d = x.Degree;
                while (A[d] != null)
                {
                    var y = A[d];
                    if (x.NodeData > y.NodeData)
                    {
                        var tmp = x;
                        x = y;
                        y = tmp;
                    }
                    FibLink(H, y, x);
                    A[d] = null;
                    d++;
                }
                A[d] = x;
            }

            H.Min = null;

            for (int i = 0; i < maxDegree; i++)
            {
                if (A[i] != null)
                {
                    if (H.Min == null)
                    {
                        H.Min = A[i];
                    }
                    else
                    {
                        if (A[i].NodeData < H.Min.NodeData)
                        {
                            H.Min = A[i];
                        }
                    }
                }
            }
        }
예제 #5
0
        public void CascadingCut(NodeTree y)
        {
            var z = y.Parent;

            if (z != null)
            {
                if (y.Mark == false)
                {
                    y.Mark = true;
                }
                else
                {
                    Cut(y, z);
                    CascadingCut(z);
                }
            }
        }
예제 #6
0
        public void DecreaseKey(NodeTree x, int k)
        {
            if (k > x.NodeData)
            {
                throw new Exception("Новый ключ больше текущего");
            }
            x.NodeData = k;
            var y = x.Parent;

            if ((y != null) && (x.NodeData < y.NodeData))
            {
                Cut(x, y);
                CascadingCut(y);
            }
            if (x.NodeData < Min.NodeData)
            {
                Min = x;
            }
        }
예제 #7
0
 /// <summary>
 /// Удаляет указанный узел из кучи.
 /// </summary>
 public void Delete(NodeTree x)
 {
     DecreaseKey(x, int.MinValue);
     ExtractMin();
 }