Ctrl K

Длины для дорог на ремонте

Сложная
В области n городов с номерами от 0 до n - 1 и двусторонние дороги roads[i] = [a, b, w] между городами a и b. Если w > 0, это длина готовой дороги, и менять её нельзя. Если w = -1, дорога на ремонте и её длину предстоит назначить вам: целое число от 1 до 2·10⁹. Длина 2·10⁹ означает, что дорога по сути закрыта. Назначьте длины так, чтобы кратчайшее расстояние от города start до города finish стало ровно distance. Подходящих вариантов обычно много, поэтому нужен вполне определённый: 1. Возьмите наименьшее k ≥ 0, при котором цели можно добиться, держа закрытыми все ремонтируемые дороги, кроме первых k по порядку в списке. 2. Из этих k дорог первые k - 1 получают длину 1, а k-я — ту единственную длину, при которой расстояние становится ровно distance. Остальные ремонтируемые дороги получают 2·10⁹. Верните список всех дорог в исходном порядке, с уже назначенными длинами. Если добиться расстояния distance нельзя, верните пустой список.
Пример 1
n=4, roads=[[0, 1, -1], [1, 3, -1], [0, 2, 3], [2, 3, 4]], start=0, finish=3, distance=5 → [[0, 1, 1], [1, 3, 4], [0, 2, 3], [2, 3, 4]]

Без ремонтируемых дорог путь 0 → 2 → 3 длиной 7 — длиннее 5. Открыть одну дорогу 0–1 мало: до 3 из 1 не добраться. Открываем первые две: дорога 0–1 получает длину 1, а 1–3 — наименьшую длину 4, при которой путь 0 → 1 → 3 равен ровно 5.

Пример 2
n=3, roads=[[0, 1, 2], [1, 2, -1], [0, 2, 3]], start=0, finish=2, distance=4 → []

Готовая дорога 0–2 уже даёт расстояние 3 < 4, а ремонт его не удлинит — ответ пустой.

Пример 3
n=3, roads=[[0, 1, -1], [1, 2, 6], [0, 2, 5]], start=0, finish=2, distance=5 → [[0, 1, 2000000000], [1, 2, 6], [0, 2, 5]]

Расстояние уже равно 5, поэтому k = 0: ремонтируемая дорога остаётся закрытой и получает длину 2·10⁹.

Ограничения
  • 1 ≤ n ≤ 100
  • 1 ≤ len(roads) ≤ n·(n − 1)/2
  • roads[i] = [a, b, w], 0 ≤ a, b < n, a ≠ b
  • w = -1 или 1 ≤ w ≤ 10⁷
  • 0 ≤ start, finish < n, start ≠ finish
  • 1 ≤ distance ≤ 10⁹
  • Все города связаны дорогами, между двумя городами не больше одной дороги
Встречал эту задачу на настоящем собесе?
Решили0
Пробовали0
Отправок0
Принято—
Темы
Похожие задачиШарик и лунка СложнаяКонтрольные точки в пределах шагов СложнаяПерекрасить стрелки до выхода СложнаяСквозь стены в дальний угол СложнаяЗалы, открывающиеся по расписанию Сложная
загружаем Python…
Вход
n=4, roads=[[0, 1, -1], [1, 3, -1], [0, 2, 3], [2, 3, 4]], start=0, finish=3, distance=5
Ожидается
[[0, 1, 1], [1, 3, 4], [0, 2, 3], [2, 3, 4]]

«Запустить» — первые 3 теста у тебя в браузере, «Отправить» — все 80 тестов на сервере, включая скрытые.