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

L. Порядок кружков

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

Кружки надо посетить все, соблюдая требования «сначала такие-то». За ii-й по счёту посещённый кружок с номером jj дают Ni1jN^{i-1} \cdot j конфет. Найдите порядок посещения, дающий наибольшее число конфет.

Разбираемся с весами

Награда - это число iNi1ji\sum_i N^{i-1} j_i, то есть запись числа в системе счисления с основанием NN, где цифра позиции ii равна номеру кружка jij_i.

Старшая позиция - последняя посещённая. Значит максимизировать надо в таком порядке: сначала номер на последнем месте, потом на предпоследнем, и так далее. Цифры не переполняются: номер кружка меньше NN.

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

Как это построить

Выбираем последний элемент: им может быть любой кружок, от которого никто не зависит, - в графе требований это вершина с нулевой исходящей степенью. Из них берём наибольший. Убираем и повторяем.

То есть обычный алгоритм Кана, но на обращённом графе и с кучей максимумов; полученную последовательность в конце разворачиваем.

for (int v = 1; v <= n; v++) if (outdeg[v] == 0) ready.push(v);   // max-heap
while (!ready.empty()) {
    int v = ready.top(); ready.pop();
    tail.push_back(v);
    for (int p : prerequisites[v]) if (--outdeg[p] == 0) ready.push(p);
}
std::reverse(tail.begin(), tail.end());

Почему жадность работает

Последняя позиция весит больше, чем все остальные вместе: NN1>i<N1Ni(N1)N^{N-1} > \sum_{i<N-1} N^i \cdot (N-1) при основании NN. Поэтому увеличить номер на последней позиции всегда выгоднее, чем что угодно на всех предыдущих. Дальше рассуждение повторяется для оставшихся позиций.

Подробнее: «Топологическая сортировка».

Формат ввода

В первой строке - число кружков NN (1N1051 \le N \le 10^5).

В следующих NN строках - описание требований: сначала kik_i (0kiN10 \le k_i \le N-1), затем kik_i номеров кружков, которые надо пройти до ii-го. Сумма kik_i не превосходит 21052 \cdot 10^5. Порядок, удовлетворяющий всем требованиям, существует.

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

Выведите NN номеров - порядок посещения, дающий наибольшее число конфет.

Примеры

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