Поиски пути. DFS, BFS.
Постановка задачи • Задан граф. Найти путь из одной вершины в другую(или во все )
BFS • Идея – взять текущую вершину, посмотреть куда можно попасть из нее, запомнить эти вершины, а текущую отбросить. Иначе говоря, пускай мы подожгли лес – огонь будет равномерно распространятся в разные стороны.
Визуализация идеи
Псевдокод • BFS(, ) 1 d[s] 0 2 Q 3 Q. push(s) 4 while Q 5 do u Q. pop 6 for v: uv E 7 do if d[v] = 8 then d[v] d[u] + 1 9 Q. push(v)
Реализация на C++
Применения • Поиск в ширину может применяться для решения задач, связанных с теорией графов: • Волновой алгоритм поиска пути в лабиринте • Волновая трассировка печатных плат • Поиск компонент связности в графе • Поиск кратчайшего пути между двумя узлами невзвешенного графа • Поиск в пространстве состояний: нахождение решения задачи с наименьшим числом ходов, если каждое состояние системы можно представить вершиной графа, а переходы из одного состояния в другое — рёбрами графа • Нахождение кратчайшего цикла в ориентированном невзвешенном графе • Нахождение всех вершин и рёбер, лежащих на каком-либо кратчайшем пути между двумя вершинами a и b • Поиск увеличивающего пути в алгоритме Форда-Фалкерсона (алгоритм Эдмондса-Карпа)
DFS(Depth first search) • Идея – для каждой непройденной вершины необходимо найти все непройденные смежные вершины и повторить поиск для них.
Обход вершин
Реализация • vector < vector<int> > g; // граф • int n; // число вершин vector<char> used; void dfs (int v) { used[v] = true; for (vector<int>: : iterator i=g[v]. begin(); i!=g[v]. end(); ++i) if (!used[*i]) dfs (*i); }
Применения • …