Пожалуйста, предложите некоторый алгоритм, чтобы найти узел в дереве, расстояние до его самого дальнего узла минимально среди всех узлов - PullRequest
5 голосов
/ 25 февраля 2010

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

Это не график и он не взвешен.

Ответы [ 5 ]

10 голосов
/ 25 февраля 2010

Выберите произвольный узел v в дереве T . Запустите BFS, делая v в качестве корня T . BFS выводит расстояния от v до всех остальных узлов T .

Теперь выберите узел u , который находится дальше всего от v . Запустите BFS снова, сделав u в качестве пользователя root. На новом выходе расстояния найдите узел w , который находится дальше всего от u .

Рассмотрим путь между u и w . Это самый длинный путь в дереве T . Узел в середине пути - это центр дерева T .

Обратите внимание, что в дереве может существовать два центра. Если это так, то они соседи.

Производительность: O (n) , где n - количество узлов T .

Доказательство

Заявка : лист ( u ), наиболее удаленный от некоторого узла v , лежит на самом длинном пути.

Если мы докажем это, тогда алгоритм верен, так как сначала он находит u , и, поскольку это один конец самого длинного пути, использует DFS для поиска самого этого пути.

Доказательство претензии : Давайте использовать retucto ad absurdum. Предположим, u --- r - самый длинный путь в дереве; и для некоторого узла v ни v --- u , ни v --- r не является самым длинным путем из v . Вместо этого самый длинный путь - v --- k . У нас есть два случая:

а) u --- r и v - k имеют общий узел o . Тогда v-o-u и v-o-r короче u --- o --- k . Тогда o --- r короче o --- k . Тогда u --- o --- r не самый длинный путь в графе, потому что u --- o --- k длиннее. Это противоречит нашему предположению.

b) u --- r и v - k не имеют общих узлов. Но поскольку граф связан, на каждом из этих путей есть узлы o1 и o2 , так что путь между ними o1 - o2 не содержат любые другие узлы на этих двух путях. Противоречие с предположением такое же, как в пункте а), но с o1 - o2 вместо простого o (на самом деле точка a просто особый случай b , где o1 = o2 ).

Это доказывает утверждение и, следовательно, правильность алгоритма.

(это доказательство, написанное Павлом Шведом , и первоначальный автор может иметь более короткое).

3 голосов
/ 25 февраля 2010

Удалить листья. Если осталось более 2 узлов, повторите. Оставленный узел (или 2 узла) будет тем узлом, который вы ищете.

Почему это работает:

Узлы находятся в середине самого длинного пути P в дереве. Их максимальное расстояние до любого узла составляет не более половины длины пути (в противном случае он не будет самым длинным). Любой другой узел на P, очевидно, будет иметь большее расстояние до дальнего конца P, чем найденные узлы. Любой узел n, находящийся вне P, будет иметь как минимум самый дальний узел (расстояние от n до ближайшего узла в P, скажем c) + (расстояние от c до следующего конца P), то есть больше, чем число узлов, найденных алгоритмом.

1 голос
/ 25 февраля 2010

Вы можете использовать алгоритм Джонсона для разреженных графов, но в противном случае используйте алгоритм Флойда-Варшалла просто потому, что его тривиально реализовать.

По сути, вы хотите найти расстояние от каждого узла до каждого другого узла, а затем просто тривиально найти желаемое свойство.

1 голос
/ 25 февраля 2010

Вы можете использовать алгоритм Дейкстры (http://en.wikipedia.org/wiki/Dijkstra%27s_algorithm) на каждом узле по очереди, чтобы найти все расстояния от этого узла до каждого другого узла; отсканируйте полученный список, чтобы получить расстояние до самого дальнего узла. Как только вы После того, как Dijkstra'd каждый узел, еще одно сканирование даст вам минимум этого максимального расстояния.

Дейкстра обычно считается имеющим время выполнения O(v^2), где v - количество узлов; вы будете запускать его один раз для каждого узла, что увеличит время до O(v^3) в простой реализации. Вы можете получить прибыль, сохранив результаты предыдущих запусков Dijkstra и используя их в качестве известных значений в последующих запусках.

0 голосов
/ 25 февраля 2010

Как уже говорили другие в комментариях: Дерево - это граф, точнее, ненаправленный связный ациклический граф, см. «Дерево» (теория графов) .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...