Поиск по графу с первой глубиной
применяет поиск по глубине к графу v = dfsearch(G,s)G начиная с узла s. Результатом является вектор идентификаторов узлов в порядке их обнаружения.
[___] = dfsearch(___,'Restart',, где tf)tf является true, перезапускает поиск, если из обнаруженных узлов нет доступных новых узлов. В предыдущих синтаксисах можно использовать любую комбинацию входных или выходных аргументов. Эта опция гарантирует, что поиск по глубине достигает всех узлов и рёбер на графике, даже если они не доступны из начального узла. s.
dfsearch и bfsearch относиться к неориентированным графам так же, как к направленным графам. Неориентированное ребро между узлами s и t обрабатывается как два направленных края, один из s кому t и один из t кому s.
Алгоритм поиска Depth-First начинается с начального узла, sи проверяет соседа s имеет наименьший индекс узла. Затем для этого соседа он проверяет следующего неоткрытого соседа с самым низким индексом. Это продолжается до тех пор, пока поиск не встретит узел, соседи которого уже посещены. В этот момент поиск возвращается по пути к ближайшему ранее обнаруженному узлу, имеющему неоткрытый сосед. Этот процесс продолжается до тех пор, пока не будут посещены все узлы, доступные из начального узла.
В псевдокоде (рекурсивный) алгоритм может быть записан как:
Event startnode(S)
Call DFS(S)
function DFS(C)
Event discovernode(C)
FOR edge E from outgoing edges of node C, connecting to node N
Event edgetonew(C,E), edgetodiscovered(C,E) or edgetofinished(C,E)
(depending on the state of node N)
IF event was edgetonew
Call DFS(N)
END
END
Event finishnode(C)
END
dfsearch может возвращать флаги для описания различных событий в алгоритме, например, когда обнаружен новый узел или когда все исходящие края узла были посещены. Здесь перечислены флаги событий.
| Флаг события | Описание события |
|---|---|
'discovernode' |
Обнаружен новый узел. |
'finishnode' |
Все исходящие границы узла посещены. |
'startnode' |
Этот флаг указывает начальный узел в поиске. |
'edgetonew' |
Край подключается к неоткрытому узлу |
'edgetodiscovered' |
Edge подключается к ранее обнаруженному узлу |
'edgetofinished' |
Кромка подключается к готовому узлу |
Дополнительные сведения см. в описании входного аргумента для events.
Примечание
В случаях, когда входной граф содержит узлы, которые недоступны из начального узла, 'Restart' предоставляет способ сделать поиск посещаемым каждым узлом в графике. В этом случае 'startnode' событие указывает начальный узел при каждом перезапуске поиска.