ЗАДАЧИ
problems.ru |
О проекте
|
Об авторах
|
Справочник
Каталог по темам | по источникам | |
|
Задача 102922
УсловиеИгровое поле представляет собой N кружков, некоторые из которых соединены отрезками. Каждому кружку приписана какая-то стоимость, а на каждом отрезке поставлена стрелка. Один из кружков является начальным, другой – конечным. Игрок должен переместить фишку из начального кружка в конечный, пройдя по каждому из отрезков ровно один раз. За перемещение по отрезку он получает определенное количество очков, равное стоимости кружка, в который он перемещается, взятой со знаком плюс, если движение происходит по направлению стрелки, и со знаком минус – если в противоположном.Требуется определить максимальное количество очков, которое может
набрать игрок в этой игре.
РешениеЗаметим, что если пройти по каждому отрезку ровно один раз, то получится эйлеров путь. Проверка существования в графе такого пути осуществляется эффективно на основе критерия эйлеровости [Липский 87, п. 2.7]: граф должен быть связен (за исключением, быть может, изолированных вершин), и все вершины, за исключением начальной и конечной, должны иметь четную степень. Начальная же и конечная, если они не совпадают, – нечетную.Если мы установили существование в графе эйлерова пути, то дальше поиск пути с максимальной возможной суммой осуществляется перебором. Перед тем, как начинать перебор, имеет смысл найти какой-нибудь путь эффективным алгоритмом и запомнить его в качестве решения, наилучшего из найденных. Пусть в процессе перебора мы уже построили некоторую начальную часть пути. Если добавление к суммарной стоимости этого пути всех оставшихся ребер графа, пройденных в направлении стрелок, не даст нам более хорошего решения, чем наилучшее на текущий момент, то следует делать отсечение. Получив в процессе перебора некоторый путь, можно попытаться улучшить его, найдя в нем какой-нибудь цикл и изменив направление прохода по этому циклу на противоположное. Источники и прецеденты использования |
© 2004-...
МЦНМО
(о копирайте)
|
Пишите нам
|