ЗАДАЧИ
problems.ru |
О проекте
|
Об авторах
|
Справочник
Каталог по темам | по источникам | |
|
Задача 102893
УсловиеВ стране N городов, в каждом из которых есть аэропорт. Авиакомпания, занимающаяся перевозкой грузов, имеет самолет и желает максимально выгодно его использовать. Для некоторых пар городов (A, B) известны время перелета из A в B и сумма выручки за доставку груза из A в B. Напишите программу, которая по этим данным находит для самолета замкнутый путь, максимизирующий среднюю выручку за единицу времени.Считается, что самолет может вместить не более одного груза, а временем
стоянки самолета в аэропорту следует пренебречь.
РешениеСкачать архив тестов и решенийНужно найти такой цикл D, для которого средняя выручка за единицу времени максимальна (сумма берется по всем ориентированным ребрам цикла). Обозначим это максимальное значение через z*. Возьмем некоторое пробное значение z0 и рассмотрим граф с модифицированными весами [Кристофидес 78, п. 8.4] с'ij = cij - z0bij. Используем алгоритм Флойда для нахождения циклов положительного c'-веса [Кристофидес 78, п. 8.4]. Возможны три случая. 1. Существует цикл D положительного c'-веса. Это означает, что откуда z0 < z(D) ≤ z*. 2. Существует цикл D с нулевым (но не положительным) c'-весом. В этом случае
Искать величину z* будем следующим образом. Сначала найдем для нее верхнюю (z1) и нижнюю (z2 ≥ z1 / 2) границы (подумайте, как это сделать!). Далее используем двоичный поиск, деля каждый раз отрезок [z1, z2] пробной точкой z0 = (z1 + z2) / 2 на две равные части и оставляя ту из них, на которой лежит z*. Необходимое при этом количество итераций пропорционально числу правильных значащих разрядов z*, которое мы хотим получить. Источники и прецеденты использования |
© 2004-...
МЦНМО
(о копирайте)
|
Пишите нам
|