45 template<
typename,
typename>
70template<
typename T,
typename C>
81 explicit PairingHeap(
const C& cmp = C(),
int initialSize = -1);
92 const T&
top()
const override;
154template<
typename T,
typename C>
158template<
typename T,
typename C>
164template<
typename T,
typename C>
167 return m_root->value;
170template<
typename T,
typename C>
174 m_root = m_root ==
nullptr ? heapNode : merge(m_root, heapNode);
178template<
typename T,
typename C>
183 m_root = pair(children);
186template<
typename T,
typename C>
188 heapNode->
value = value;
189 if (heapNode->
prev !=
nullptr) {
191 m_root = merge(m_root, heapNode);
195template<
typename T,
typename C>
197 m_root = merge(m_root, other.
m_root);
201template<
typename T,
typename C>
203 if (heapNode ==
nullptr) {
215 while (it->
next !=
nullptr) {
222 if (children % 2 == 1) {
230 a->
prev = a->
next = b->prev = b->next =
nullptr;
231 result = merge(a, b);
234 for (
size_t i = 0; i < (children - 1) / 2; i++) {
237 a->
prev = a->
next = b->prev = b->next =
nullptr;
238 result = merge(merge(a, b), result);
244template<
typename T,
typename C>
261template<
typename T,
typename C>
263 if (root->
child !=
nullptr) {
265 root->
child->prev = child;
271template<
typename T,
typename C>
273 if (heapNode->
prev->child == heapNode) {
274 heapNode->
prev->child = heapNode->
next;
276 heapNode->
prev->next = heapNode->
next;
278 if (heapNode->
next !=
nullptr) {
279 heapNode->
next->prev = heapNode->
prev;
281 heapNode->
prev =
nullptr;
282 heapNode->
next =
nullptr;
285template<
typename T,
typename C>
299 if (it->
child !=
nullptr) {
303 if (it->
next !=
nullptr) {
313 if (prev ==
nullptr) {
316 if (curr == prev->
child && prev->next !=
nullptr) {
Interface for heap implementations.
Basic declarations, included by all source files.
Common interface for all heap classes.
Pairing heap implementation.
static void release(PairingHeapNode< T > *heapNode)
Releases memory occupied by list of heaps given as heapNode.
static void link(PairingHeapNode< T > *parent, PairingHeapNode< T > *child)
Makes child node a child of parent node.
PairingHeapNode< T > * m_root
Root node of the heap.
void merge(PairingHeap< T, C > &other) override
Merges in values of other heap.
PairingHeapNode< T > * push(const T &value) override
Inserts a new node with given value into a heap.
const T & top() const override
Returns reference to the top element in the heap.
PairingHeapNode< T > * pair(PairingHeapNode< T > *heapNode)
Pairs list of heaps given as heapNode. Returns resulting list.
void pop() override
Removes the top element from the heap.
PairingHeap(const C &cmp=C(), int initialSize=-1)
Creates empty pairing heap.
virtual ~PairingHeap()
Destructs pairing heap.
static void unlink(PairingHeapNode< T > *heapNode)
Removes heapNode from its parent children list.
void decrease(PairingHeapNode< T > *heapNode, const T &value) override
Decreases value of the given heapNode to value.
const T & value(PairingHeapNode< T > *heapNode) const override
Returns the value of the node.
#define OGDF_ASSERT(expr)
Assert condition expr. See doc/build.md for more information.
The namespace for all OGDF objects.
PairingHeapNode(const T &valueOfNode)
Creates heap node with a given valueOfNode.
PairingHeapNode< T > * next
Next sibling of the node.
PairingHeapNode< T > * child
First child of the node.
T value
Value contained in the node.
PairingHeapNode< T > * prev
Previous sibling of the node or parent.