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

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

Привет всем! Собственно я столкнулся с задачей на нахождение центров дерева (Дерево — связный неориентированный граф без циклов). В интернете толком не нашел понятного мне определения центра дерева. Прошу, объясните мне что такое центр дерева? И какой алгоритм нахождения центров?

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

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

Вероятно имеется ввиду вершина, максимальное расстояние до другой вершины от которой минимально.[Таких вершин может быть несколько]

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

    А алгоритм нахождения какой будет? Тут надо использовать поиск в ширину?

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

      центр дерева это вершина максимально удаленная от других вершин. в дереве центр это либо одна вершина либо две, находящаяся(находящиеся) в середине пути между двумя самыми удаленными вершинами. чтобы найти две самых удаленых вершины в дереве (за расстояние между соседними вершинами считаем 1) можно использовать два поиска в ширину (для дерева можно и DFS). сначала найдем от любой вершины x самую удаленную от неё вершину y, затем найдем вершину z, самую удаленную от y. путь из y в z — это один из самых больший путей в графе.

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

        Спасибо! Теперь стало понятно!

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

        Вообще-то, это не будет один из самых больших путей.
        Вот, например:

              x
              |
              x
              |
              x
             /|\
            x x x
           /  |  \
        x-x-x-x-x-x-x
           \  |  /
            x x x
             \|/
              x
              |
              x
              |
              x
        

        Если начать из левой вершины, то придём в правую, а потом — снова в левую. Тогда как самый длинный путь — между верхней и нижней.

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

          Ваш граф не дерево. "центр дерева это..."

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

          Согласен, что не для дерева это не работает. А как найти самый длинный путь для произвольного графа? (Веса единичные)

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

            не знаю, алгоритмом Флойда, например. А Вы можете доказать, что такой алгоритм работает для дерева?

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

              Да, это не очень сложно доказывается. A — начальная вершина, B — самая удаленная от A, C — самая удаленная от B. 1: Максимальный путь и путь от B к C имеют общую вершину. Если нет общей вершины, то есть путь длиннее масимального или один из концов максимального пути удален от B дальше чем C, что невозможно исходя из выбора точки C. Потом рисуем крестик, обозначаем точки и видим что это максимальный путь по любому :) Ночь сейчас, посмотри на рисунок там все вроде понятно, лениво расписывать все случаи сейчас.
              А по поводу Флойда пожалуйста подробнее, кое-где на форумах говорят что задача поиска наидлиннейшего пути NP.

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

                Казалось бы, она не проще Гамильнонова пути, нет?

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

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

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

Сегодня узнал простой вариант решения этой проблемы: можно сделать поиск в ширину, начав с листьев дерева. То есть сначала найти листья (вершины с degree == 1) за линейное время, добавить их в очередь и запустить BFS. Последняя достигнутая вершина будет центром (или одной из центральных). http://stackoverflow.com/questions/4020122/finding-center-of-the-tree

Чтобы найти все центры, нужно по ходу BFS сохранять высоту каждой пройденной вершины (для листьев — 0, потом 1, и т.д.), все вершины с максимальной высотой будут центрами.

Не уверен, но по-моему в дереве не может быть больше двух центров.

UPD: упс, извините, алгоритм неправильный, читайте далее.

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

    Вранье же:

                      x  x  x
                      |  |  |
    x--x--x--x--x--x--x--x--x--x--x--x--x--x--x--x
                      |  |  |
                      x  x  x
    

    Вы быстро достигнете центра этого дерева, но в очередь вы его последним точно не добавите.

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

      На онсайте открытого кубка 2011-го года была задача, которую я так и решал, просто алгоритм не описан во всех подробностях, а дана лишь идея. Не помню на что была задача, то ли полиморфизм двух деревьев определить, то ли посчитать чего-то хитрое. Понятно что мы не можем обрезать 6 близких к центру листьев до тех пор, пока длинные щупальца не пообрезаются до длины 1. Это похоже на бфс, но нужны дополнительные телодвижения чтобы удалять правильно. Занумеруем 9 центральных вершин слева направо снизу вверх (как клавиши цифр на телефоне) чтобы понятнее было дальнейшее объяснение. У каждой вершины есть счетчик живых соседей. Когда счетчик живых соседей становится равным единице, вершину следует убить, а также "похоронить" её убитых соседей, пометив их все порядковым номером текущего раунда убийств. В нулевом раунде убьются две крайние вершины щупалец и вершины 1, 2, 3, 7, 8, 9. В первом раунде убъются вторая слева и вторая справа вершины, края щупалец будет погребены, и им назначется число 1. ... в 6-ом раунде убъем вершины 4 и 6, а вершины 1, 2, 3, 7, 8, 9 и еще две по краям будут похоронены.

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

        Avitella, Alias, спасибо, вы абсолютно правы. Не понимаю, почему вас заминусовали, а меня — наоборот. Наверное, потому, что мой ошибочный вариант звучит проще :)

        Извините, кого ввёл в заблуждение. По ссылке на стековерфлоу было правильное объяснение, но я его исковеркал, пытаясь упростить. На самом деле нужно запустить не BFS из листьев, а удаление листьев. И повторять удаление листьев до тех пор, пока не останется одна/две вершины. Это и будет центром.

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

    Четыре вершины, соединенные последовательно. Вот вам дерево с двумя центрами.

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

    В дереве однозначно не может быть больше двух центров, я могу привести доказательство, если хотите. Это прямо вытекает из того, что это середина (или обе середины) самого длинного пути дерева, это я тоже могу доказать, если интересно.