Когда он говорит о нескольких источниках, он ссылается на начальный узел поиска.Вы заметите, что параметры алгоритмов BFS(G, s)
и DFS(G)
.Это уже должно быть намеком на то, что BFS является одним источником, а DFS нет, поскольку DFS не принимает ни один начальный узел в качестве аргумента.
Основное различие между этими двумя, как указывают авторы,в том, что результатом BFS всегда является дерево, тогда как DFS может быть лесом (коллекцией деревьев).Это означает, что если BFS запускается с узла s, то она построит дерево только из тех узлов, которые достижимы из s, но если в графе есть другие узлы, они не будут касаться их.Однако DFS продолжит поиск по всему графу и построит лес всех этих связанных компонентов.Это, как они объясняют, является желаемым результатом каждого алгоритма в большинстве случаев использования.
Как уже упоминали авторы, ничто не мешает внести небольшие изменения в единый источник DFS.На самом деле это изменение легко.Мы просто принимаем другой параметр s
, и в подпрограмме DFS
(не DFS_VISIT
) вместо строк 5-7, повторяющихся во всех узлах графа, мы просто выполняем DFS_VISIT(s)
.
АналогичноИзменение BFS возможно, чтобы он работал с несколькими источниками.Я нашел онлайн-реализацию: http://algs4.cs.princeton.edu/41undirected/BreadthFirstPaths.java.html, хотя она немного отличается от другой возможной реализации, которая автоматически создает отдельные деревья.Это означает, что этот алгоритм выглядит следующим образом BFS(G, S)
(где S
- набор узлов), тогда как вы можете реализовать BFS(G)
и создавать отдельные деревья автоматически.Это небольшая модификация очереди, и я оставлю ее в качестве упражнения.
Как указывают авторы, причина, по которой они этого не делают, заключается в том, что основное использование каждого алгоритма делает их полезными какони есть.Хотя хорошо подумать об этом, это важный момент, который следует понимать.