Я пытаюсь реализовать алгоритм Prim для MST в C++. У меня вопрос дизайнаПроектирование структур данных для реализации Prim в C++
Я реализовал мини-кучу, которая принимает целое число, и мы можем извлечь-мин, уменьшить ключ и вставить ключ.
Теперь, как я понимаю в Prim, мне нужно поддерживать вес, информацию о соседях для каждой вершины. Некоторые идеи у меня есть следующие:
1] Определение структуры
struct node {
int vertex;
int weight;
int neighbor;
};
Используйте мин кучу, чтобы вернуть узел с минимальным весом. Но проблема заключается в уменьшении ключа, так как для клавиши уменьшения вызывающая сторона должна передать вершину, для которой он хочет уменьшить ключ. Поскольку куча меняет элементы слишком часто, я должен пройти весь список, чтобы найти вершину, а затем уменьшить ее ключ. Это O (n), я думаю, что Prim будет хуже, если я это сделаю.
2] Другим способом было бы поддерживать другой массив, который отслеживает положение вершины в очереди с мини-кучей. Но было бы громоздко отслеживать позиции во время операций с минимальными кучами.
В принципе, если мне нужно сделать уменьшающий ключ (v), как найти v в очереди мини-кучи, которая основана на весе. Так есть ли элегантный способ сделать это? который все еще может сохранить сложность?