Поиск в глубину
Материал из Википедии — свободной энциклопедии
Текущая версия страницы пока не проверялась опытными участниками и может значительно отличаться от версии, проверенной 16 января 2010;
проверки требуют 35 правок.
Порядок обхода дерева в глубину
Поиск в глубину (англ. Depth-first search, DFS) — один из методов обхода графа. Алгоритм поиска описывается следующим образом: для каждой непройденной вершины необходимо найти все не пройденные смежные вершины и повторить поиск для них. Используется в качестве подпрограммы в алгоритмах поиска одно- и двусвязных компонент, топологической сортировки.
Содержание |
[править] Алгоритм поиска в глубину
Пусть задан граф
, где
— множество вершин графа,
— множество ребер графа. Предположим, что в начальный момент времени все вершины графа окрашены в белый цвет. Выполним следующие действия:
- Из множества всех белых вершин выберем любую вершину, обозначим её
. - Выполняем для неё процедуру
DFS(.
) - Перекрашиваем её в чёрный цвет.
- Повторяем шаги 1-3 до тех пор, пока множество белых вершин не пусто.
Процедура DFS (параметр — вершина
)
- Перекрашиваем вершину
в серый цвет. - Для всякой вершины
, смежной с вершиной u, выполняем следующие два шага:
- Если вершина
окрашена в белый цвет, выполняем процедуру DFS(w). - Окрашиваем
в чёрный цвет.
- Если вершина
[править] Примеры реализации
[править] Java
public static void search(Node node, Node goal) // Node - вершина графа { if (node.equals(goal)) { System.out.println(node)); } else { for (int i = 0; i < node.getNode().size(); i++) // Вызываем этот же метод для каждой смежной вершины { if (stack.add(node.getNode().get(i))) // Проверяем, вызывали ли мы этот метод для вершины node.getNode().get(i) { search(node.getNode().get(i), goal); } } } }
[править] С++
vector < vector<int> > graph; vector<bool> used; void dfs(int node_index) { used[node_index] = true; for (vector<int>::iterator i = graph[node_index].begin(); i != graph[node_index].end(); ++i) { if ( !used[*i] ) dfs(*i); } }
[править] Pascal
const MAX_N = 10; var graph: array [1..MAX_N, 1..MAX_N] of boolean; // массив для определения графа visited: array [1..MAX_N] of boolean; procedure dfs(v: integer); var i: integer; begin visited[v] := true; for i := 1 to MAX_N do if graph[v, i] and not visited[i] then dfs(i); end;
| Алгоритмы поиска на графах |
|---|
[править] Литература
- Ананий В. Левитин Глава 5. Метод уменьшения размера задачи: Поиск в глубину // Алгоритмы: введение в разработку и анализ = Introduction to The Design and Analysis of Aigorithms. — М.: «Вильямс», 2006. — С. 212-215. — ISBN 0-201-74395-7
- Кормен Т., Лейзерсон Ч., Ривест Р. Глава 22. Элементарные алгоритмы для работы с графами // Алгоритмы: построение и анализ(второе издание). — М.: «Вильямс», 2005. — С. 622-632.


.
в серый цвет.
,