Блог пользователя Kickazz

Автор Kickazz, 11 лет назад, По-русски

Всем привет! Не могу решить одну задачу на дерево. Надеюсь, что мне сможет кто-нибудь помочь. Дано дерево, необходимо в вершины расставить числа так, чтобы у соседних вершин числа различались(вершины соседние, если между ними есть дуга) и сумма всех чисел была минимальна. Числа от 1 до бесконечности. Кол-во вершин n<10^5 Для ясности намалевал рисунок. Вот линк Pic

  • Проголосовать: нравится
  • +8
  • Проголосовать: не нравится

»
11 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится

Прикольный рисунок, но его нет)

»
11 лет назад, # |
Rev. 3   Проголосовать: нравится 0 Проголосовать: не нравится

Запустим как-то dfs. При погружении/возвращении из вершины уменьшаем/увеличиваем текущий ключ. Осталось додумать как лучше это делать.

  • »
    »
    11 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится

    Меня больше решение интересует, нежели реализация

»
11 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится

Тупая же задача...

Заметим, что любое дерево является двудольным графом. Отсюда очевидно, что нам нет смысла использовать числа больше двойки. Т.о. заполним большую долю единицами, меньшую — двойками.

  • »
    »
    11 лет назад, # ^ |
      Проголосовать: нравится +20 Проголосовать: не нравится

    На прилагаемом рисунке граф распадается на две доли размера 6 вершин. По вашему методу ответ 18, а на рисунке ответ 16. Что-то не то.

  • »
    »
    11 лет назад, # ^ |
    Rev. 2   Проголосовать: нравится +5 Проголосовать: не нравится

    Это было первое, о чем я подумал и даже написал, но в сэмпле меня ждал сюрприз N=8 ребра - 1 2 - 1 3 - 1 4 - 1 5 - 5 6 - 5 7 - 5 8 Верный ответ 11. Ваш алгоритм даст 12. Или я ошибаюсь?

    • »
      »
      »
      11 лет назад, # ^ |
        Проголосовать: нравится +4 Проголосовать: не нравится

      Да, мой жадный алгоритм неправильный.

      ОК, тогда можно написать весьма простую динамику. Подвесим дерево за произвольную вершину, и пусть dp[v][num] — минимальная сумма, которую можно получить в поддереве вершины v так, чтобы в вершине v было число num. Считаем динамику очевидным способом: изначально dp[v][num] = num, далее для каждого потомка v2 вершины v выбираем такой num2 != num, что dp[v2][num2] минимально, и прибавляем к dp[v][num].

      Каким же должен быть максимальный num? Интуитивно кажется, что 3, но мне это лень доказывать.

»
11 лет назад, # |
Rev. 4   Проголосовать: нравится +1 Проголосовать: не нравится

Если задача есть в некотором Online Judge я бы попробовал дп с битовыми масками. Есть довольно убедительные полуинтуитивные аргументы указывающие на то, что различных чисел должно быть задействовано немного. Легко видеть, что порядок меньше корня. Полагаю даже меньше либо равно логарифма. Четко доказать не могу, но есть некоторая конструкция показывающая что с ростом количества различных чисел число вершин должно серьезно возрастать. Рядом с вершиной в которой мы пишем 4 должны располагаться поддеревья, в которых есть вершины 3, 2, 1. рядом с вершиной, в которой мы пишем 5, должны располагаться другие поддеревья, в которых есть вершины 4, 3, 2, 1, ну и и т.д. Как было замечено граф двудольный. Я это не заметил сразу, подумал лишь что планарный, поэтому 4-х красок хватит, но вот что их хватит для минимальности сомневаюсь. Вроде бы этому строится контр-пример конструкцией чуть выше. Можно попровать дп, изменяя масимальное число различных чисел вверх, по мере получения WA, или подумать как строить жадно начиная с листьев дерева, и перекрашивая потом некоторые объединяемые поддеревья, если это становится выгодно.

  • »
    »
    11 лет назад, # ^ |
      Проголосовать: нравится +5 Проголосовать: не нравится

    А, гоню. Нам ведь и не нужны никакие маски. Достаточно знать число, которое стоит в вершине поддерева, и общую сумму в поддереве.

  • »
    »
    11 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится

    Поправлюсь, правильнее сказать "не более корня". А объединение по дп простое, для детей той вершины куда мы щас ставим число числа в вершинах могут и совпадать, поэтому просто запоминаем для каждого ребёнка два минимума, перебираем то что ставим в вершине и выбираем минимум не равный текущему числу в вершине.

  • »
    »
    11 лет назад, # ^ |
      Проголосовать: нравится +1 Проголосовать: не нравится

    Именно логарифма.

    Если в минимальной нумерации есть число k, то это означает, что с ним смежны вершины с числами 1, 2, ..., k - 1. Пусть минимальное число вершин, которые должны висеть на вершине "k - 1", чтобы было необходимо поставить именно k - 1, равно fk - 1. Но на самом деле причина, по которой необходимо поставить именно k - 1 — это то, что на этой вершине уже висят вершины со всеми меньшими номерами. Так что, fk - 1 — это как раз то количество вершин, которое нужно, чтобы на вершине k - 1 висели вершины 1, 2, ..., k - 2. Получается, что на вершине k должны висеть как минимум 2fk - 1 + 1 вершина.