/// <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++; }
public void Cut(NodeTree x, NodeTree y) { y.Childrens.Remove(x); y.Degree--; Roots.Add(x); x.Parent = null; x.Mark = false; }
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; }
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]; } } } } }
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); } } }
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; } }
/// <summary> /// Удаляет указанный узел из кучи. /// </summary> public void Delete(NodeTree x) { DecreaseKey(x, int.MinValue); ExtractMin(); }