Какова наилучшая структура данных для описания неориентированного мультиграфа (оптимизированного для скорости и памяти)?
Список ребер будет неуместным, так как в моем коде часто происходит соседи вершин.
Список смежности не является хорошим, потому что я должен хранить информацию о посещенных ребрах и когда посещают край от 1 до 3 (скажем, я прохожу через соседей по 1 и нашел край, который ведет к трем, и имеет вес w
), я должен найти тот же край в списке соседей из 3, чтобы пометить его как посетив, что медленно.
Я думал о матрице смежности, когда каждая ячейка была бы set<Edge>
, где Edge
- это структура, представляющая информацию о том, посещает ли вершина, вес края и т.д. Однако, когда graph[0][1][i]
посещен Я не могу установить один и тот же ребро в ребрах graph[1][0]
без линейного поиска.
Есть ли хорошие подходы и методы при представлении мультиграфов? Я не хочу использовать третьи библиотеки, например boost::AdjacencyList
; Я должен написать это самостоятельно.
Изменить: Извините за недоразумение. Это упражнение для университета, и я могу использовать только стандартную библиотеку для этого. График имеет ограничения: 0 < n ≤ 300 - количество вершин 0 < m ≤ 20000 - количество ребер 1 ≤ w ≤ 500
Я имею ограничение памяти 32 МБ и ограничение по времени 0,5 с (мне нужно пройти через DFS).