Бесплатная бета: 30 дней полного доступа, без карты.Зарегистрироваться бесплатно

Мы используем необходимые куки для работы сайта (вход и язык). Формы обратной связи и сообщения об ошибке дополнительно используют Google reCAPTCHA для защиты от спама. Она загружается только если вы согласитесь. Политика конфиденциальности

Полевой справочник

Компоненты связности

O(V+E)

Проходим по каждому узлу; от каждого ещё не посещённого запускаем полный обход, который помечает всю его группу, и считаем это одной компонентой. Число обходов, нужных чтобы покрыть граф, и есть число отдельных частей.

Сигналы

посчитать число отдельных групп/островов/кластеровграф может быть несвязнымсколько связных частейкруги друзейразметить связные области

Шаблон

function countComponents(n, adj) {
    const visited = new Set();
    let count = 0;
    for (let start = 0; start < n; start++) {
        if (visited.has(start)) continue;
        count++;
        const stack = [start];
        visited.add(start);
        while (stack.length) {
            const node = stack.pop();
            for (const next of adj[node] || []) {
                if (!visited.has(next)) {
                    visited.add(next);
                    stack.push(next);
                }
            }
        }
    }
    return count;
}

Похоже, но не то

  • Обход графа BFS / DFS: Один BFS/DFS от одного старта покрывает только компоненту, содержащую этот узел. Чтобы посчитать компоненты, нужен проход по всем узлам с новым обходом от каждого ещё не посещённого.
  • Union-find: Компоненты подходят для графа, зафиксированного до начала подсчёта. Union-find нужен, когда рёбра продолжают прибывать со временем и между слияниями надо отвечать 'одна ли это группа?'.

V, E до ~1e5, граф может быть несвязным, нужно посчитать число отдельных частей -> O(V+E): проход и его обходы вместе касаются каждого узла и ребра один раз.

Изучить этот паттерн