Задание №23. Короткий конспект
Направление рёбер, минимум по предшественникам и целая часть длины кратчайшего пути.
В варианте №23 на кратчайший путь дан ациклический ориентированный граф с положительными весами. Требуется минимальная сумма весов от старта 1 до финиша 100; в ответе — её целая часть. Наличие пути гарантировано.
Опорные обозначения
| Запись | Смысл |
|---|---|
L M W | Ребро из L в M веса W |
| d(v) | Минимальная длина пути из 1 в v |
| d(1)=0 | В старте ещё не пройдено ни одного ребра |
| d(v)=\infty | Пути из старта нет; это не нулевое расстояние |
Для вершины, отличной от старта: d(v)=\min_{u\to v}\bigl(d(u)+w(u,v)\bigr). Здесь w(u,v) — вес последнего ребра. Сравниваются все входящие рёбра. Пустой набор кандидатов или только недостижимые предшественники дают \infty.
Порядок вычисления
- Читается весь файл без пропуска первой строки: заголовка нет.
line.split()разделяет поля по пробелам и табуляциям. - Для каждого конца ребра сохраняются пары «начало, вес». Номера преобразуются в
int, вес — вDecimalнепосредственно из строки. - Функция расстояния рекурсивно запрашивает расстояния до предшественников и берёт минимум сумм. Отдельный случай старта возвращает 0; отсутствие входящих рёбер — бесконечность.
@cacheсохраняет результат для каждой вершины. Повторный запрос получает готовое значение. Ацикличность исключает замкнутую цепочку вызовов.- После нахождения
d(100)целая часть вычисляется черезint(d(100)). Промежуточные веса и суммы не усекаются.
Короткая проверка
Путь через два ребра весов 5{,}5 и 2 имеет длину 7{,}5, что меньше прямого перехода веса 12. Целая часть — 7. Этот результат относится к малому примеру; у полного файла свой ответ.
Возможные ловушки
- Обратное чтение ребра меняет достижимость:
6 1 1.0разрешает только 6\to1. - Числовая сортировка вершин не задаёт зависимости. Вычисление следует рёбрам, в том числе от большего номера к меньшему.
- Ноль вместо бесконечности создаёт несуществующий путь. Нулевое начальное расстояние есть только у старта.
roundокругляет, а требуется отбросить дробную часть. Усечение отдельных весов может изменить сумму. Целая часть берётся только у итоговой минимальной длины.