Тарьян (SCC одним проходом)
Сильно связные компоненты за один DFS: низкие ссылки находят корни.
1function tarjanSCC(graph: Map<string, string[]>): string[][] {2 let index = 03 const idx = new Map<string, number>()4 const low = new Map<string, number>()5 const onStack = new Set<string>()6 const stack: string[] = []7 const sccs: string[][] = []8 9 function strongconnect(v: string): void {10 idx.set(v, index)11 low.set(v, index)12 index++13 stack.push(v)14 onStack.add(v)15 16 for (const w of graph.get(v) ?? []) {17 if (!idx.has(w)) {18 strongconnect(w)19 low.set(v, Math.min(low.get(v)!, low.get(w)!))20 } else if (onStack.has(w)) {21 low.set(v, Math.min(low.get(v)!, idx.get(w)!))22 }23 }24 25 // корень SCC: low == idx26 if (low.get(v) === idx.get(v)) {27 const comp: string[] = []28 let w: string29 do {30 w = stack.pop()!31 onStack.delete(w)32 comp.push(w)33 } while (w !== v)34 sccs.push(comp)35 }36 }37 38 for (const v of graph.keys()) {39 if (!idx.has(v)) strongconnect(v)40 }41 42 return sccs43}Проблема
Сильно связные компоненты за один DFS: низкие ссылки находят корни.
Что вы видите
У каждой вершины idx и low: low[v] = насколько высоко можно вернуться из v. low == idx → корень SCC, стек выдаёт компоненту.
Как это работает
Низкая ссылка low[v] — минимальный индекс, достижимый из поддерева v через одно обратное ребро. Вершина с low == idx — корень SCC: снимаем стек до неё.
Пошаговый разбор
- 01
idx/low
Индекс входа и низкая ссылка.
- 02
Обратное ребро
В стек — low уменьшается.
- 03
Корень
low == idx: снять SCC.
Complexity и ограничения
Сложность см. в шапке страницы.
Edge cases
- Пустой вход
Корректная тривиальная обработка.
- Вырожденный случай
Минимум работы — сразу ответ.
Где встречается в реальности
Компиляторы
Циклы в зависимостях.
Ретроспективный анализ
Сжатие графов до DAG.
Сети
Кластеры взаимных ссылок.
Связанные алгоритмы
«Косарайю нужно два прохода. Тарьяну — один»
Тот же сценарий StepSequence в вертикальной композиции — с safe zones и записью WebM ниже на странице.
Shorts 9:16
Вертикальная композиция строится той же последовательностью шагов, что и страница: safe zones отмечены пунктиром (там живёт UI платформ), биты сценария подсвечиваются по прогрессу. Кнопка записи сохраняет WebM — детерминированная StepSequence даёт воспроизводимый ролик без монтажа.