DEV//UNIT

Тарьян (SCC одним проходом)

Сильно связные компоненты за один DFS: низкие ссылки находят корни.

время O(V + E)память O(V)уровень: продвинутый
Что происходит сейчас0/0
Нажмите Play, чтобы запустить сценарий
TypeScript — активная строка подсвечена шагом
1function tarjanSCC(graph: Map<string, string[]>): string[][] {
2 let index = 0
3 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 == idx
26 if (low.get(v) === idx.get(v)) {
27 const comp: string[] = []
28 let w: string
29 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 sccs
43}

Проблема

Сильно связные компоненты за один DFS: низкие ссылки находят корни.

Что вы видите

У каждой вершины idx и low: low[v] = насколько высоко можно вернуться из v. low == idx → корень SCC, стек выдаёт компоненту.

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

Низкая ссылка low[v] — минимальный индекс, достижимый из поддерева v через одно обратное ребро. Вершина с low == idx — корень SCC: снимаем стек до неё.

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

  1. 01

    idx/low

    Индекс входа и низкая ссылка.

  2. 02

    Обратное ребро

    В стек — low уменьшается.

  3. 03

    Корень

    low == idx: снять SCC.

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

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

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

Edge cases

  • Пустой вход

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

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

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

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

Компиляторы

Циклы в зависимостях.

Ретроспективный анализ

Сжатие графов до DAG.

Сети

Кластеры взаимных ссылок.

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

Shorts

«Косарайю нужно два прохода. Тарьяну — один»

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

Shorts 9:16

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

Косарайю нужно два прохода. Тарьяну — один
Нажмите Play
Бит 1/6 · 0–2 с
Hook
script-setup.ru/algorithms/tarjan