Что делает: обходит граф в глубину (Depth-First Search)
Где применяется: проверка связности графа, поиск цикла, поиск компонент связности, топологическая сортировка, ваще много где можно (даже в динамическом программировании, вроде как, как и в жадных алгоритмах так то)
Чего | Точная оценка | Почему |
---|---|---|
Время | O( | V |
Память | O(V) | Глубина рекурсии не превысит общего числа вызова DFS (числа вершин). Aka затраты на “стек” из-за рекурсии |
Общая идея:
Для каждой не пройденной вершины найти все не пройденные смежные вершины и повторить поиск для них
Реализация:
// псевдокод писала Я так что чекните если что не так!
int main() {
for u из G(V) do
u.color = white // помечаем все вершинки белым O(|V|)
for u из G(V) do
if (u.color == white) // запускаем DFS для всех не пройденных вершинок
DFS(u)
}
void DFS(int u) {
u.color = gray // помечаем, что вершинка находится в процессе обхода
for v из G(V) do
if v.color == white
DFS(v)
u.color = black // после обхода всех смежных вершин помечаем, что вершина прошла DFS
}
По необходимости можно использовать два цвета - белый и чёрный. Серый цвет нужен, например, для проверки и поиска циклов в графе. При белом/чёрном можно заменить color на массив visited[], и при заходе в DFS сразу помечать вершинку как visited[v] = true.
‼ Особенности DFS:
Визуализация: