1

Тема: Коровы

В селе Максоярославке коровы обычно пасутся на лужайках, соединенных дорожками, на каждой
лужайке пасется хотя бы одна корова. При этом для каждой пары лужаек есть ровно один способ
пройти от одной лужайки до другой. По каждой дорожке можно двигаться в обоих направлениях.
Главный фермер села хочет построить на лужайках два коровника для своих коров. Ясно, что
каждая корова вечером будет возвращаться именно в тот коровник, который ближе к ее лужайке (если
расстояние до коровников одинаково, то в любой из них). Поэтому возникает задача определения
такого расположения коровников, при котором наибольшее из расстояний, проходимых коровами, было
бы минимально.
Количество лужаек N <= 100000

2

Re: Коровы

Можно наибольшее расстояние перебирать дихотомией и смотреть возможно ли для заданного макс. расстояния расстановка коровников. Так как у нас дерево, то проверять расстановку скорей всего можно за линейно (например поиском в глубину + жадный).

3

Re: Коровы

А по подробнее можете объяснить?

4

Re: Коровы

Возможно идея неправильная или не оптимальная, потому как она обещает работать не только для двух коровников.

   Допустим мы научились для заданного расстояния определять, а можно ли так расставить коровники чтобы максимально расстояние не превышало заданного, т.е. мы максимальное расстояния знать не будем, мы только можем отвечать можно или нельзя.
   Тогда если мы это умеем можно воспользоваться дихотомией (двоичным поиском) для поиска минимального такого расстояния которое нам подходит. Ведь если для какого либо расстояние можно расположить коровники, то и для любого большего тоже можно расположить, и наоборот - если для какого либо нельзя, то и для меньшего тоже нельзя.
   Теперь осталась научиться определять можно или нельзя. Пока идея только такая - идем обходом в глубину (обход начинаем из любой вершины) и определяем надо ли в текущей вершине(лужайке) ставить коровник.
   Как определяем:

  • Допустим в текущем поддереве нет коровника, тогда коровник поставиться в текущую лужайку если высота дерева (расстояние до максимально удаленной лужайки в текущем поддереве) равна заданному расстоянию, тогда ставим.

  • Если уже есть коровник, тогда среди тех лужаек которые не могут за заданное расстояние добраться до коровника находим максимально удалённую и также ставим если оно равно заданному. Максимальна удаленная лужайку будет листом. Допустим мы хотим найти максимально удаленную для текущей вершины (лужайки). Надо проверить только те вершины которые являются максимально удаленными вершинами потомков текущей вершины.

Можно заметить что первый случай легко может быть обработан во втором.