Использование обхода в глубину для проверки связности — различия между версиями

Материал из Викиконспекты
Перейти к: навигация, поиск
Строка 1: Строка 1:
 
== Задача ==
 
== Задача ==
Дан неориентированный граф. Необходимо проверить является ли он связным.
+
Дан [[Основные определения теории графов|неориентированный граф]]. Необходимо проверить является ли он связным.
  
 
== Идея ==
 
== Идея ==
Небольшая модификация алгоритма обхода в глубину. Смысл алгоритма заключается в том, чтобы считать сколько вершин мы посетили во время обхода.
+
Небольшая модификация алгоритма [[Обход в глубину, цвета вершин|обхода в глубину]]. Смысл алгоритма заключается в том, чтобы считать сколько вершин мы посетили во время обхода.
  
 
== Алгоритм ==
 
== Алгоритм ==
Заведём счётчик количества вершин которые мы ещё не посетили. В стандартной процедуре dfs() будем уменьшать счётчик на единицу перед выходом из процедуры. Запустимся от какой-то вершины нашего графа(если он связен, то мы посетим все остальные). По окончании работы процедуры 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--;