Использование обхода в глубину для проверки связности — различия между версиями
Kasetkin (обсуждение | вклад) |
Kasetkin (обсуждение | вклад) |
||
Строка 1: | Строка 1: | ||
== Задача == | == Задача == | ||
− | Дан неориентированный граф. Необходимо проверить является ли он связным. | + | Дан [[Основные определения теории графов|неориентированный граф]]. Необходимо проверить является ли он связным. |
== Идея == | == Идея == | ||
− | Небольшая модификация алгоритма обхода в глубину. Смысл алгоритма заключается в том, чтобы считать сколько вершин мы посетили во время обхода. | + | Небольшая модификация алгоритма [[Обход в глубину, цвета вершин|обхода в глубину]]. Смысл алгоритма заключается в том, чтобы считать сколько вершин мы посетили во время обхода. |
== Алгоритм == | == Алгоритм == | ||
− | Заведём счётчик количества вершин которые мы ещё не посетили. В стандартной процедуре dfs() будем уменьшать счётчик на единицу перед выходом из процедуры. Запустимся от какой-то вершины нашего графа | + | Заведём счётчик количества вершин которые мы ещё не посетили. В стандартной процедуре dfs() будем уменьшать счётчик на единицу перед выходом из процедуры. Запустимся от какой-то вершины нашего графа. По окончании работы процедуры dfs() сравним счётчик с нулём. Если они равны, то мы побывали во всех вершинах графа, а следовательно он связен. Если счётчик отличен от нуля, то в графе несколько компонент связности. Работает алгоритм за O(M + N). |
== Псевдокод == | == Псевдокод == |
Версия 07:52, 10 ноября 2010
Содержание
Задача
Дан неориентированный граф. Необходимо проверить является ли он связным.
Идея
Небольшая модификация алгоритма обхода в глубину. Смысл алгоритма заключается в том, чтобы считать сколько вершин мы посетили во время обхода.
Алгоритм
Заведём счётчик количества вершин которые мы ещё не посетили. В стандартной процедуре dfs() будем уменьшать счётчик на единицу перед выходом из процедуры. Запустимся от какой-то вершины нашего графа. По окончании работы процедуры dfs() сравним счётчик с нулём. Если они равны, то мы побывали во всех вершинах графа, а следовательно он связен. Если счётчик отличен от нуля, то в графе несколько компонент связности. Работает алгоритм за O(M + N).
Псевдокод
string color[]; //изначально массив color заполнен значениями white. int count = n; //счётчик количества вершин; изначально равен количеству вершин в графе bool if_connected() dfs(0); //запуск от какой-то вершины if(count == 0) return true; else return false; int dfs(int u) //процедура обхода в глубину. запуск от номера вершины for(v: uv - ребро) if(color[v] == white) dfs(v); color[u] = black; count--;