У меня есть неориентированный граф, в котором узлы хранятся в плоском массиве. Теперь ищу структуру данных для краев. Он должен иметь постоянную временную сложность для получения всех ребер данного узла. Ребро содержит два индекса узла и дополнительную информацию, например вес.

Единственный способ, который я вижу, - это дублирование данных, одно из которых отсортировано по левому узлу, а другое - по правому узлу.

vector<vector<int>> left, right;

Но хотелось бы, чтобы края не дублировались.

0
danijar 1 Янв 2014 в 17:50

2 ответа

Лучший ответ

Похоже, вам просто нужно представление списка смежности.

В этом представлении каждый узел будет хранить список всех своих связанных ребер.

Для неориентированного графа каждая конечная точка может хранить ребро.

На самом деле нет способа получить соединенные ребра для узла за постоянное время без некоторого дублирования. Но вы можете просто сохранить указатель, ссылку или уникальный идентификатор (который может быть, например, индексом в массиве краев) для фактического края, предотвращая необходимость иметь две его копии, плавающие вокруг.

3
Bernhard Barker 1 Янв 2014 в 13:55

Составьте вектор из векторов.

У каждого узла будет вектор всех узлов, которые он имеет.

Вы должны построить это во время создания графика.

1
Vladp 1 Янв 2014 в 13:57