Я всегда заканчиваю тем, что реализовал свою собственную версию типа Heap по той самой причине, что вы не можете на самом деле искать в Heap, в то время как все эффективные методы требуют «указатель на элемент» в качестве входных данных.
Обычно я реализую свою кучу как комбинацию неструктурированного контейнера Предметов и кучи указателей (или индексов) на Предметы. Если вы сохраняете указатель на расположение кучи в элементе, у вас есть прямая двусторонняя ссылка:
a) Дан элемент Heap (например, возвращенный extractMin или во время сравнения): разыменуйте указатель, и вы получите свой элемент.
b) Для данного элемента (например, через список смежности алгоритма Graph): передайте указатель на любую функцию обновления, которую вы хотите.
Конечно, это приводит к накладным расходам пространства (2 дополнительных указателя / целых числа на элемент), но это делает реструктуризацию кучи очень дешевой (замена нескольких указателей вместо замены целых элементов), что, в свою очередь, делает менее болезненным добавление некоторых дополнительных спутниковые данные для ваших предметов.