В BGL, как эффективно найти соседнюю вершину, используя свойство вершины

У меня есть двунаправленный граф (то есть ориентированный граф, в котором можно перебирать как внутренние, так и внешние края).

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

Это свойство не является уникальным в пределах графа (т. е. могут быть две вершины с одинаковым идентификатором), поэтому его нельзя использовать с named/labeled_graph. Однако он уникален в пределах данной вершины, то есть как входящие, так и исходящие соседи вершины должны иметь разные идентификаторы.

Мой вопрос заключается в том, есть ли в BGL встроенный механизм для эффективного поиска соседней вершины u, вершины v с учетом дескриптора u, график и идентификатор u.

Конечно, этого можно добиться с помощью некоторого внешнего сопоставления, но это похоже на довольно распространенный сценарий, и, учитывая, что первый параметр шаблона adjacency_list может быть ассоциативным контейнером, кажется вполне естественным иметь какой-то вид find_adjacent(v,g,ID). ) функция, увы, ничего похожего мне найти не удалось.

Большое спасибо, Андрей


person Andrey    schedule 15.04.2015    source источник


Ответы (1)


Вы не публикуете образец, но из приведенного описания вы можете выбрать упорядоченный набор для OutEdgeList и упорядочить его по идентификатору целевой вершины (который уникален в этой области).

Теперь вы можете использовать std::lower_bound/std::upper_bound/std::equal_range на out_edges любого заданного узла.

Если вы предпочитаете, вы можете легко добавить бесплатные функции, такие как find_adjacent, чтобы скрыть реализацию.

person sehe    schedule 15.04.2015