DEV//UNIT

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

Два прохода DFS — и множества «взаимно достижимых» вершин найдены.

время O(V + E)память O(V + E)уровень: средний
Что происходит сейчас0/0
Нажмите Play, чтобы запустить сценарий
TypeScript — активная строка подсвечена шагом
1function kosaraju(graph: Map<string, string[]>): string[][] {
2 // 1. порядок выхода DFS на исходном графе
3 const visited = new Set<string>()
4 const order: string[] = []
5 for (const v of graph.keys()) {
6 if (!visited.has(v)) dfs1(v)
7 }
8 function dfs1(v: string): void {
9 visited.add(v)
10 for (const next of graph.get(v) ?? []) {
11 if (!visited.has(next)) dfs1(next)
12 }
13 order.push(v) // вышли — записали
14 }
15
16 // 2. DFS на перевёрнутом графе в порядке убывания exit-времени
17 const reversed = reverseGraph(graph)
18 const seen = new Set<string>()
19 const sccs: string[][] = []
20 for (const v of [...order].reverse()) {
21 if (seen.has(v)) continue
22 const comp: string[] = []
23 dfs2(v)
24 sccs.push(comp)
25 function dfs2(v: string): void {
26 seen.add(v)
27 comp.push(v)
28 for (const next of reversed.get(v) ?? []) {
29 if (!seen.has(next)) dfs2(next)
30 }
31 }
32 }
33
34 return sccs
35}

Проблема

Два прохода DFS — и множества «взаимно достижимых» вершин найдены.

Что вы видите

Первый проход ставит exit-метки; рёбра разворачиваются; второй проход в порядке убывания меток собирает SCC.

Как это работает

Сильно связная компонента: из любой вершины достижима любая другая. Косарайю: порядок выхода DFS + обход перевёрнутого графа. Сжатие SCC превращает любой граф в DAG.

Пошаговый разбор

  1. 01

    Проход 1

    Exit-времена при выходе из DFS.

  2. 02

    Разворот

    Все рёбра наоборот.

  3. 03

    Проход 2

    Каждое DFS-дерево = SCC.

Complexity и ограничения

time
O(V + E)
space
O(V + E)

Сложность см. в шапке страницы.

Edge cases

  • Пустой вход

    Корректная тривиальная обработка.

  • Вырожденный случай

    Минимум работы — сразу ответ.

Где встречается в реальности

Компиляторы

Циклические зависимости модулей = SCC.

Соцсети

Кластеры «все общаются со всеми».

Веб

Сильносвязанные ядра ссылок.

Связанные алгоритмы

Shorts

«Циклы становятся точками: SCC»

Тот же сценарий StepSequence в вертикальной композиции — с safe zones и записью WebM ниже на странице.

Shorts 9:16

Вертикальная композиция строится той же последовательностью шагов, что и страница: safe zones отмечены пунктиром (там живёт UI платформ), биты сценария подсвечиваются по прогрессу. Кнопка записи сохраняет WebM — детерминированная StepSequence даёт воспроизводимый ролик без монтажа.

Циклы становятся точками: SCC
Нажмите Play
Бит 1/6 · 0–2 с
Hook
script-setup.ru/algorithms/kosaraju