2012-05-11 3 views
4

Я использую очередь STL для реализации BFS (поиск по ширине первого) на графике. Мне нужно нажать узел в очереди, если этот узел уже не существует в очереди. Однако очередь STL делает not allow iteration through its elements, и поэтому я не могу использовать функцию поиска STL.Найти, если элемент уже существует в очереди STL

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

+0

Для хранения цвета узлов на вашем графике требуется отдельный хранилище данных. Если каждый узел имеет уникальный идентификатор, который можно использовать как ключ, вы можете использовать 'std :: map' для хранения цвета (белый, серый, черный) узлов. Это будет «O (log (n)», поскольку «std :: map» реализовано как дерево RB в большинстве реализаций. – Vikas

+0

@Vikas: Я считаю, что это эквивалентно назначению счетчика каждому узлу. – Ari

+0

каждый узел в BFS проходит через три состояния, не посещенные, посещенные, но не завершенные, завершенные. Я действительно не знаю, что вы имели в виду, назначая счетчики для каждого узла. Но если вы можете добиться поддержания трехсостояний узла, вы может использовать его. – Vikas

ответ

6

Предполагаю, что вы реализуете концепцию «закрытого набора» в вашей BFS? Стандартный способ сделать это - просто поддерживать отдельные std::set или std::unordered_set элементов, которые уже встречались. Таким образом, вы получите O (lg n) или O (1), а повторение через очередь, если оно будет поддерживаться, займет время O (n).

+0

Спасибо. Я думаю, что это работает, хотя мне придется очистить набор в начале каждого раунда BFS. – Ari

+0

@ Ари: что вы подразумеваете под раундом? –

+0

Мне нужно запустить BFS несколько раз. Я имею в виду каждую итерацию ** i **, что я запускаю алгоритм BFS. Для каждого узла у меня есть переменная ** c **, которую я увеличиваю при посещении. Я посещаю только каждый узел, если этот узел не был посещен на итерации i , т.е. c Ari

Смежные вопросы