← Вернуться к оглавлению
Alterna · глава 17 · страница 17.3

Подсчёт путей в ДАГ

Топологическая сортировка + динамическое программирование.

ДАГ (DAG) — ориентированный граф без циклов. Главное свойство: можно топологически отсортировать вершины. На этом основан алгоритм подсчёта путей за O(V+E).

ФГОСФОПОГЭ №9ЕГЭ №1
🔗
Связь с главой 16 (Логические схемы) и главой 17.2

В логических схемах сигнал проходит от входов к выходу, и важно найти путь (или все пути), которые сигнал может пройти. В главе 17.2 вы научились описывать граф и считать степени вершин. Теперь — следующий шаг: в графах без циклов (ДАГ) можно точно посчитать, сколько существует путей из одной точки в другую. Это нужно для анализа сложности схем, подсчёта вариантов сборки проекта, планирования последовательности задач. ДАГ — основа для понимания того, как работают проекты сборки (make, npm), как устроены криптовалюты без блокчейна (IOTA, Nano), как планируются вычисления в нейросетях.

📊

Примеры ДАГ

a.c b.c lib.o app main.o makefile
Сборка проекта
Makefile, package.json

Какие файлы должны быть собраны до других. Порядок зависимостей.

Tx1 Tx2 Tx3 Tx4 Tx5 IOTA DAG
Блокчейн IOTA
DAG вместо цепочки блоков

Вместо линейной цепочки — граф транзакций. Быстрее и масштабируемее.

x w₁ w₂ σ f ŷ нейросеть
Вычислительный граф нейросети
Операции и их порядок

Слои нейросети — вершины, зависимости по данным — рёбра.

фунд стены коммун крыша окна дом
Сетевой график строительства
Какие работы должны закончиться

Критический путь, анализ сроков. ДАГ помогает планировать.

01

ДАГ и его свойства

Определение

ДАГ (Directed Acyclic Graph) — ориентированный граф, в котором нет циклов.

Топологическая сортировка — линейное упорядочивание вершин, в котором каждое ребро u→v идёт «вперёд» (u раньше v).

Существует тогда и только тогда, когда граф — ДАГ.

Где встречается
  • Сборка проекта: make-файлы, package.json — порядок сборки.
  • Планировщик задач: какие задачи зависят от других.
  • Git: история коммитов (DAG, не цепочка).
  • Нейросети: вычислительный граф операций.
  • Криптовалюты: блокчейн (DAG, не цепочка — IOTA, Nano).

Пример ДАГ (6 вершин)

Рёбра: 1→2, 1→3, 2→4, 2→5, 3→5, 4→6, 5→6.

Топсорт: 1, 2, 3, 4, 5, 6 (один из вариантов).

02

Подсчёт путей в ДАГ

Что такое ДАГ?

ДАГ (Directed Acyclic Graph) — ориентированный граф без циклов. Это значит, что顺着 рёбрам можно дойти от любой вершины только в одном направлении, и зацикливание невозможно.

Зачем считать пути?

В информатике ДАГ используется для:

  • Планирования проектов (сетевые графики)
  • Подсчёта способов выполнения задач
  • Анализа зависимостей в Makefile
  • Маршрутизации в сетях

Формула динамического программирования

Пусть dp[v] — количество путей от стартовой вершины s до вершины v.

База: dp[s] = 1 — путь из одной вершины в саму себя (нулевая длина)
Переход: dp[v] = Σu → v dp[u] — сумма путей всех предшественников
Порядок: топологическая сортировка — сначала предки, потом потомки

Топологическая сортировка

Алгоритм: находим вершины с in-degree = 0, добавляем в очередь, удаляем их рёбра, повторяем. Результат — порядок, при котором все предки любой вершины уже обработаны.

Сложность

Время: O(V + E) — один проход по всем вершинам и рёбрам. Память: O(V) для хранения dp.

📊Симулятор: подсчёт путей в ДАГ
Нажми «Шаг» для пошагового выполнения или «Анимация» для автовоспроизведения.
03

Алгоритм Дейкстры

Определение

Алгоритм Дейкстры находит кратчайшие пути от одной вершины до всех остальных во взвешенном графе без отрицательных рёбер.

  1. Расстояние до стартовой = 0, до остальных = ∞.
  2. Выбрать вершину с минимальным расстоянием (не посещённую).
  3. Для каждого ребра из неё: если путь к соседу через текущую короче — обновить.
  4. Повторять, пока все вершины не посещены.
Где используется GPS-навигация, маршрутизация в сетях, играх (пути персонажей), робототехника.
🗺Визуализатор Дейкстры
Схема алгоритма:
1. dist[s]=0, остальным =∞
2. Повторять:
   a) выбрать необработанную вершину с мин dist
   b) пометить её обработанной
   c) для каждого ребра u→v с весом w:
      если dist[u]+w < dist[v]:
        dist[v] = dist[u]+w
        prev[v] = u
3. Повторять пока очередь не пуста
04

Мини-тест

📝 ДАГ и пути — 5 вопросов из 50
Уровень: Новичок
0 / 50 XP
0
Вопрос 1 из 5