EduBrick
← вернуться к уроку · Уровень профи: проверь себя

E. Длиннейший путь

1000 мс · 256 МБ · всё или ничего

В ориентированном ациклическом графе найдите наибольшее количество рёбер в пути. Путь может начинаться и заканчиваться где угодно.

В обычном графе это невозможно, в ациклическом - линейно

Поиск длиннейшего простого пути в произвольном графе - NP-трудная задача: из неё следует гамильтонов путь. Но в ациклическом графе слова «простой» не нужно: повторить вершину всё равно нельзя, раз нет циклов. И задача становится обычной динамикой.

dp[v]=maxuv(dp[u]+1),\text{dp}[v] = \max_{u \to v} \bigl(\text{dp}[u] + 1\bigr),

а обрабатывать вершины надо в топологическом порядке - тогда к моменту обработки vv все dp[u]\text{dp}[u] готовы. Ответ - максимум по всем вершинам.

Обойтись одним проходом

Отдельный топологический порядок строить не обязательно: динамику удобно считать прямо внутри алгоритма Кана, проталкивая значение вперёд по ребру:

while (!queue.empty()) {
    int v = queue.front(); queue.pop();
    best = std::max(best, dp[v]);
    for (int to : g[v]) {
        dp[to] = std::max(dp[to], dp[v] + 1);
        if (--deg[to] == 0) queue.push(to);
    }
}

Зачем это нужно

Длиннейший путь в ациклическом графе - это «сколько шагов займёт самая длинная цепочка зависимостей». В расписании работ это критический путь, в сборке - глубина зависимостей, в задаче про минимакс из этого же занятия - проверка, хватит ли ходов.

Подробнее: «Динамика на ациклическом графе».

Формат ввода

В первой строке - числа nn и mm (1n1051 \le n \le 10^5, 0m21050 \le m \le 2 \cdot 10^5).

В следующих mm строках - рёбра uu, vv ациклического графа. Возможны кратные рёбра.

Формат вывода

Выведите наибольшее число рёбер в пути.

Примеры

ввод
4 3
1 2
2 3
3 4
вывод
3
ввод
4 2
1 2
3 4
вывод
1
Войдите, чтобы отправлять решения.
← Вернуться к уроку