Рассмотрите задачу на тему дискретной математики: дан ориентированный граф с весами на рёбрах, опишите алгоритмы для поиска длиннейшего пути в ациклическом графе и почему задача становится трудноразрешимой при наличии циклов
Кратко и по делу. Алгоритм для ориентированного ациклического графа (DAG) 1) Сделайте топологическую сортировку вершин (алгоритм Кана или DFS). Если топологической сортировки нет — граф не ацикличен. 2) Для поиска максимально длинного пути от заданной стартовой вершины sss: инициализируйте dist[v]=−∞\operatorname{dist}[v]=-\inftydist[v]=−∞ для всех vvv, dist[s]=0\operatorname{dist}[s]=0dist[s]=0. 3) Обойдите вершины в топологическом порядке; для каждого ребра (u→v)(u\to v)(u→v) выполняйте релаксацию если dist[u]+w(u,v)>dist[v], то dist[v]:=dist[u]+w(u,v).
\text{если }\operatorname{dist}[u]+w(u,v)>\operatorname{dist}[v]\text{, то }\operatorname{dist}[v]:=\operatorname{dist}[u]+w(u,v). еслиdist[u]+w(u,v)>dist[v], тоdist[v]:=dist[u]+w(u,v).
4) В конце dist[v]\operatorname{dist}[v]dist[v] — длина максимального пути от sss до vvv. Если нужен глобальный максимум по всем парам, можно инициализировать dist[v]=0\operatorname{dist}[v]=0dist[v]=0 для всех vvv и взять maxvdist[v]\max_v\operatorname{dist}[v]maxvdist[v]. Временная сложность: O(∣V∣+∣E∣)\;O(|V|+|E|)O(∣V∣+∣E∣) (топосортировка + одно прохождение по ребрам). Почему задача становится трудноразрешимой при наличии циклов - Если в графе есть цикл с суммарным положительным весом, то длина пути может быть неограниченно большой (можно проходить цикл многократно) — задача максимум не имеет смысла без ограничения на повторение вершин. - Если требовать простые пути (без повторения вершин), то в общем ориентированном графе задача «существует ли простой путь длины не меньше kkk» (LONGEST‑PATH) является NP‑полной. Короткая схема доказательства: сведение из задачи о гамильтоновом пути. Для графа с nnn вершинами присвоив всем ребрам вес 111 и взяв k=n−1k=n-1k=n−1, вопрос «есть ли простой путь длины ≥k\ge k≥k» эквивалентен «есть ли гамильтонов путь». Следовательно оптимизационная версия (найти самый длинный простой путь) NP‑трудна. - Практически это означает, что при наличии циклов нет известного полиномиального алгоритма для общей задачи; возможны либо экспоненциальные точные алгоритмы (перебор, динамика по битмаскам за примерно O(2∣V∣poly(∣V∣))O(2^{|V|}\operatorname{poly}(|V|))O(2∣V∣poly(∣V∣))), либо эвристики/приближённые алгоритмы (и даже аппроксимация в общем случае трудна). Итого: в DAG максимум находится за линейное время через топологический порядок и релаксации; в общем графе задача простого длиннейшего пути NP‑трудна, а при положительных циклах длина может быть бесконечной.
Алгоритм для ориентированного ациклического графа (DAG)
1) Сделайте топологическую сортировку вершин (алгоритм Кана или DFS). Если топологической сортировки нет — граф не ацикличен.
2) Для поиска максимально длинного пути от заданной стартовой вершины sss: инициализируйте dist[v]=−∞\operatorname{dist}[v]=-\inftydist[v]=−∞ для всех vvv, dist[s]=0\operatorname{dist}[s]=0dist[s]=0.
3) Обойдите вершины в топологическом порядке; для каждого ребра (u→v)(u\to v)(u→v) выполняйте релаксацию
если dist[u]+w(u,v)>dist[v], то dist[v]:=dist[u]+w(u,v). \text{если }\operatorname{dist}[u]+w(u,v)>\operatorname{dist}[v]\text{, то }\operatorname{dist}[v]:=\operatorname{dist}[u]+w(u,v).
если dist[u]+w(u,v)>dist[v], то dist[v]:=dist[u]+w(u,v). 4) В конце dist[v]\operatorname{dist}[v]dist[v] — длина максимального пути от sss до vvv. Если нужен глобальный максимум по всем парам, можно инициализировать dist[v]=0\operatorname{dist}[v]=0dist[v]=0 для всех vvv и взять maxvdist[v]\max_v\operatorname{dist}[v]maxv dist[v].
Временная сложность: O(∣V∣+∣E∣)\;O(|V|+|E|)O(∣V∣+∣E∣) (топосортировка + одно прохождение по ребрам).
Почему задача становится трудноразрешимой при наличии циклов
- Если в графе есть цикл с суммарным положительным весом, то длина пути может быть неограниченно большой (можно проходить цикл многократно) — задача максимум не имеет смысла без ограничения на повторение вершин.
- Если требовать простые пути (без повторения вершин), то в общем ориентированном графе задача «существует ли простой путь длины не меньше kkk» (LONGEST‑PATH) является NP‑полной. Короткая схема доказательства: сведение из задачи о гамильтоновом пути. Для графа с nnn вершинами присвоив всем ребрам вес 111 и взяв k=n−1k=n-1k=n−1, вопрос «есть ли простой путь длины ≥k\ge k≥k» эквивалентен «есть ли гамильтонов путь». Следовательно оптимизационная версия (найти самый длинный простой путь) NP‑трудна.
- Практически это означает, что при наличии циклов нет известного полиномиального алгоритма для общей задачи; возможны либо экспоненциальные точные алгоритмы (перебор, динамика по битмаскам за примерно O(2∣V∣poly(∣V∣))O(2^{|V|}\operatorname{poly}(|V|))O(2∣V∣poly(∣V∣))), либо эвристики/приближённые алгоритмы (и даже аппроксимация в общем случае трудна).
Итого: в DAG максимум находится за линейное время через топологический порядок и релаксации; в общем графе задача простого длиннейшего пути NP‑трудна, а при положительных циклах длина может быть бесконечной.