Я использую C ++ STL с пользовательским компаратором для хранения структуры данных Edge, как показано ниже. Я определил, что Edge по существу является парой ключ-значение. Индекс — это ключ, и я хочу перебрать коллекцию по значению (maxlength) от наибольшего к наименьшему. В любой момент времени я обычно забочусь только о ребрах с тремя самыми большими значениями. В коллекции будет только относительно небольшое количество ребер, от 7 до 64. Когда я вставлю ребро, значения двух смежных ребер нужно будет отрегулировать. Для этого я добавлю новое ребро в набор, затем уберу два смежных ребра и заново добавлю их с новыми значениями. Кто-нибудь может поделиться более эффективной структурой данных для этой цели?
#include <iostream>
#include <iomanip>
#include <sstream>
#include <set>
using namespace std;
struct Edge {
int maxlength;
int index;
Edge(int index, int maxlength) {
this->maxlength = maxlength;
this->index = index;
}
bool operator<(Edge other) const {
return maxlength < other.maxlength;
}
};
void run() {
set<Edge> edges;
edges.insert(Edge(25, 3));
edges.insert(Edge(21, 4));
edges.insert(Edge(28, 2));
cout << "First Edge: " << edges.begin()->maxlength << endl;
edges.erase(Edge(28, 2));
cout << "First Edge: " << edges.begin()->maxlength << endl;
edges.insert(Edge(39, 1));
cout << "First Edge: " << edges.begin()->maxlength << endl;
cout << "Last Edge: " << (--edges.end())->maxlength << endl;
}
int main() {
run();
return 1;
}
Задача ещё не решена.
Других решений пока нет …