Использование обхода в глубину для проверки связности — различия между версиями
Kamensky (обсуждение | вклад) м (Код раскрашен) |
Kamensky (обсуждение | вклад) (Код на плюсах превращен в псевдокод) |
||
Строка 12: | Строка 12: | ||
=== Реализация === | === Реализация === | ||
− | + | '''bool[]''' visited; //массив цветов вершин | |
− | + | ||
− | '''bool''' dfs('''int''' | + | '''bool''' dfs(u: '''int''') |
− | |||
'''if''' (u == t) | '''if''' (u == t) | ||
'''return''' ''true''; | '''return''' ''true''; | ||
visited[u] = ''true''; //помечаем вершину как пройденную | visited[u] = ''true''; //помечаем вершину как пройденную | ||
− | '''for''' (v таких, что (u, v) — ребро в G) | + | '''for''' (v таких, что (u, v) — ребро в G) //проходим по смежным с u вершинам |
− | '''if''' ('''not''' visited[v]) | + | '''if''' ('''not''' visited[v]) //проверяем, не находились ли мы ранее в выбранной вершине |
'''if''' (dfs(v)) | '''if''' (dfs(v)) | ||
'''return''' ''true''; | '''return''' ''true''; | ||
'''return''' ''false''; | '''return''' ''false''; | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
== Алгоритм проверки связности графа G == | == Алгоритм проверки связности графа G == | ||
Строка 45: | Строка 32: | ||
=== Алгоритм === | === Алгоритм === | ||
− | Заведём счётчик количества вершин которые мы ещё не посетили. В стандартной процедуре dfs() будем уменьшать счётчик на единицу при входе в процедуру. | + | Заведём счётчик количества вершин которые мы ещё не посетили. В стандартной процедуре dfs() будем уменьшать счётчик на единицу при входе в процедуру. Запустим алгоритм от какой-то вершины нашего графа. Если в конце работы процедуры dfs() счётчик равен нулю, то мы побывали во всех вершинах графа, а следовательно он связен. Если счётчик отличен от нуля, то мы не побывали в какой-то вершине графа. Работает алгоритм за <tex>O(M + N)</tex>. |
=== Реализация === | === Реализация === | ||
− | + | '''bool[]''' visited; //массив цветов вершин | |
− | '''int''' k = | + | '''int''' k = n; //счетчик изначально равен количеству вершин |
− | + | function dfs(u: '''int''') | |
− | |||
k--; | k--; | ||
visited[u] = ''true''; //помечаем вершину как пройденную | visited[u] = ''true''; //помечаем вершину как пройденную | ||
− | '''for''' (v таких, что (u, v) — ребро в G) | + | '''for''' (v таких, что (u, v) — ребро в G) //проходим по смежным с u вершинам |
− | '''if''' ('''not''' visited[v]) | + | '''if''' ('''not''' visited[v]) //проверяем, не находились ли мы ранее в выбранной вершине |
dfs(v); | dfs(v); | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
[[Категория: Алгоритмы и структуры данных]] | [[Категория: Алгоритмы и структуры данных]] | ||
[[Категория: Обход в глубину]] | [[Категория: Обход в глубину]] |
Версия 05:18, 9 декабря 2014
Содержание
Алгоритм проверки наличия пути из s в t
Задача
Дан граф
и две вершины и . Необходимо проверить, существует ли путь из вершины в вершину по рёбрам графа .Алгоритм
Небольшая модификация алгоритма обхода в глубину. Смысл алгоритма заключается в том, чтобы запустить обход в глубину из вершины и проверять при каждом посещении вершины, не является ли она искомой вершиной . Так как в первый момент времени все пути в графе "белые", то если вершина и была достижима из , то по лемме о белых путях в какой-то момент времени мы зайдём в вершину , чтобы её покрасить. Время работы алгоритма .
Реализация
bool[] visited; //массив цветов вершин
bool dfs(u: int) if (u == t) return true; visited[u] = true; //помечаем вершину как пройденную for (v таких, что (u, v) — ребро в G) //проходим по смежным с u вершинам if (not visited[v]) //проверяем, не находились ли мы ранее в выбранной вершине if (dfs(v)) return true; return false;
Алгоритм проверки связности графа G
Задача
Дан неориентированный граф . Необходимо проверить, является ли он связным.
Алгоритм
Заведём счётчик количества вершин которые мы ещё не посетили. В стандартной процедуре dfs() будем уменьшать счётчик на единицу при входе в процедуру. Запустим алгоритм от какой-то вершины нашего графа. Если в конце работы процедуры dfs() счётчик равен нулю, то мы побывали во всех вершинах графа, а следовательно он связен. Если счётчик отличен от нуля, то мы не побывали в какой-то вершине графа. Работает алгоритм за
.Реализация
bool[] visited; //массив цветов вершин int k = n; //счетчик изначально равен количеству вершин function dfs(u: int) k--; visited[u] = true; //помечаем вершину как пройденную for (v таких, что (u, v) — ребро в G) //проходим по смежным с u вершинам if (not visited[v]) //проверяем, не находились ли мы ранее в выбранной вершине dfs(v);