Компоненты сильной связности
Два прохода DFS — и множества «взаимно достижимых» вершин найдены.
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)) continue22 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 sccs35}Проблема
Два прохода DFS — и множества «взаимно достижимых» вершин найдены.
Что вы видите
Первый проход ставит exit-метки; рёбра разворачиваются; второй проход в порядке убывания меток собирает SCC.
Как это работает
Сильно связная компонента: из любой вершины достижима любая другая. Косарайю: порядок выхода DFS + обход перевёрнутого графа. Сжатие SCC превращает любой граф в DAG.
Пошаговый разбор
- 01
Проход 1
Exit-времена при выходе из DFS.
- 02
Разворот
Все рёбра наоборот.
- 03
Проход 2
Каждое DFS-дерево = SCC.
Complexity и ограничения
Сложность см. в шапке страницы.
Edge cases
- Пустой вход
Корректная тривиальная обработка.
- Вырожденный случай
Минимум работы — сразу ответ.
Где встречается в реальности
Компиляторы
Циклические зависимости модулей = SCC.
Соцсети
Кластеры «все общаются со всеми».
Веб
Сильносвязанные ядра ссылок.
Связанные алгоритмы
«Циклы становятся точками: SCC»
Тот же сценарий StepSequence в вертикальной композиции — с safe zones и записью WebM ниже на странице.
Shorts 9:16
Вертикальная композиция строится той же последовательностью шагов, что и страница: safe zones отмечены пунктиром (там живёт UI платформ), биты сценария подсвечиваются по прогрессу. Кнопка записи сохраняет WebM — детерминированная StepSequence даёт воспроизводимый ролик без монтажа.