Эйлеров путь
Все рёбра ровно один раз: 0 или 2 нечётных вершин.
1function eulerianPath(edges: Array<[a: string, b: string]>) {2 const deg = new Map<string, number>()3 for (const [a, b] of edges) {4 deg.set(a, (deg.get(a) ?? 0) + 1)5 deg.set(b, (deg.get(b) ?? 0) + 1)6 }7 const odd = [...deg.keys()].filter((v) => deg.get(v)! % 2 === 1)8 // Эйлер: 0 или 2 нечётных; путь начинается в одной нечётной9 10 const graph = buildAdj(edges)11 const stack = [odd[0] ?? start]12 const path: string[] = []13 14 while (stack.length > 0) {15 const v = stack[stack.length - 1]!16 if ((graph.get(v) ?? []).length > 0) {17 const w = graph.get(v)!.pop()!18 graph.get(w)!.splice(graph.get(w)!.indexOf(v), 1)19 stack.push(w) // идём по ребру, удаляя его20 } else {21 path.push(stack.pop()!) // тупик — в ответ22 }23 }24 25 return path.reverse()26}Проблема
Все рёбра ровно один раз: 0 или 2 нечётных вершин.
Что вы видите
Иерхольцер: идём и сжигаем рёбра; тупики разворачиваются в ответ.
Как это работает
Задача о мостах Кёнигсберга (1736) — начало теории графов. Степени решают существование; стек собирает путь из тупиков в обратном порядке.
Пошаговый разбор
- 01
Степени
Нечётных 0 или 2.
- 02
Сжигание
Ребро пройдено — нет его.
- 03
Стек
Тупик → в ответ.
Complexity и ограничения
Сложность см. в шапке страницы.
Edge cases
- Пустой вход
Корректная тривиальная обработка.
- Вырожденный случай
Минимум работы — сразу ответ.
Где встречается в реальности
DNA
Сборка секвенирования.
Маршруты
Обход улиц/инспекций.
Eulerian cycles
Планирование обхода графа.
Связанные алгоритмы
«1736: задача, родившая графы»
Тот же сценарий StepSequence в вертикальной композиции — с safe zones и записью WebM ниже на странице.
Shorts 9:16
Вертикальная композиция строится той же последовательностью шагов, что и страница: safe zones отмечены пунктиром (там живёт UI платформ), биты сценария подсвечиваются по прогрессу. Кнопка записи сохраняет WebM — детерминированная StepSequence даёт воспроизводимый ролик без монтажа.