Эта ссылка предоставляет алгоритм для определения диаметра ненаправленного дерева с использованием BFS / DFS . Подводя итог:
Запустите BFS на любом узле в графе, помня узел, который вы обнаружили последним. Запустите BFS, вспомнив последний обнаруженный узел v. d (u, v) - диаметр дерева.
Почему это работает?
Страница 2 этого обеспечивает рассуждение, но это сбивает с толку. Я цитирую начальную часть доказательства:
Запустите BFS на любом узле в графе, помня узел, который вы обнаружили последним. Запустите BFS, запомнив последний обнаруженный узел v. d (u, v) - диаметр дерева.
Корректность. Пусть a и b - любые два узла, так что d (a, b) - диаметр дерева. Существует уникальный путь от а до б. Пусть t будет первым узлом на этом пути, обнаруженным BFS. Если пути от s до u и от a до b не имеют общих ребер, то путь от t до u включает s. Так
.... (больше неравенства следует ..)
Неравенство не имеет смысла для меня.
Ответы:
Все части доказательства претензии основаны на двух важнейших свойствах деревьев с ненаправленными краями:
Выберите произвольный узел дерева . Пусть U ,s - узлы с d ( u , v ) = d i a m ( G ) . Предположим далее, что алгоритм находит узел x, начинающийся с s первым, а некоторый узел y, начинающийся с x следующим. wlog d ( s , u ) ≥ d ( s , v ) . Обратите внимание, чтоu,v∈V(G) d(u,v)=diam(G) x s y x d(s,u)≥d(s,v) должно выполняться, если только первая стадия алгоритма не заканчивается в точке x . Мы увидим, что d ( x , y ) = d ( u , v ) .d(s,x)≥d(s,y) x d(x,y)=d(u,v)
Наиболее общая конфигурация всех задействованных узлов может быть замечена в следующей псевдографике (возможно, или s = z x y или оба):s=zuv s=zxy
мы знаем это:
1) и 2) подразумевают .d(u,v)=d(zuv,v)+d(zuv,u)≥d(zuv,x)+d(zuv,y)=d(x,y)+2d(zuv,zxy)≥d(x,y)
3) и 4) подразумеваютd(zxy,y)+d(s,zxy)+d(zxy,x)≥d(s,zuv)+d(zuv,u)+d(v,zuv)+d(zuv,zxy) эквивалентно .d( х , у) = d( зх у, у) + d( зх у, Х )≥ 2 ∗d( С , гу v) + d( v , zу v) + d( У , гу v)≥ г( U , V )
следовательно, .d( u , v ) = d( х , у)
аналоговые доказательства верны для альтернативных конфигураций
а также
это все возможные конфигурации. в частности,x ∉ p a t h ( s , u ) , x ∉ p a t h ( s , v ) из-за результата этапа 1 алгоритма и из-за стадии 2.YA p a t h ( x , u ) , уA p a t h ( x , v )
источник
Интуиция позади очень проста для понимания. Предположим, мне нужно найти самый длинный путь, который существует между любыми двумя узлами в данном дереве.
После рисования некоторых диаграмм мы можем заметить, что самый длинный путь всегда будет происходить между двумя конечными узлами (узлами, имеющими только один связанный край). Это также может быть доказано противоречием, что, если самый длинный путь находится между двумя узлами и один или оба из двух узлов не являются листовыми узлами, то мы можем расширить путь, чтобы получить более длинный путь.
Таким образом, один из способов - сначала проверить, какие узлы являются конечными узлами, а затем запустить BFS с одного из конечных узлов, чтобы получить узел дальше от него.
Вместо того, чтобы сначала находить, какие узлы являются конечными узлами, мы запускаем BFS со случайного узла, а затем видим, какой узел находится дальше всего от него. Пусть самый дальний узел будет х. Понятно, что x - это листовой узел. Теперь, если мы запустим BFS с x и проверим самый дальний узел от него, мы получим наш ответ.
Но какова гарантия того, что x будет конечной точкой максимального пути?
Давайте посмотрим на примере: -
Предположим, я начал свою BFS с 6. Узел на максимальном расстоянии от 6 - это узел 7. Используя BFS, мы можем получить этот узел. Теперь мы запускаем BFS с узла 7, чтобы получить узел 9 на максимальном расстоянии. Путь от узла 7 к узлу 9 явно самый длинный путь.
Что, если BFS, которая началась с узла 6, дала 2 как узел на максимальном расстоянии. Затем, когда мы получим BFS из 2, мы получим 7 как узел на максимальном расстоянии, и самый длинный путь будет тогда 2-> 1-> 4-> 5-> 7 с длиной 4. Но фактическая длина самого длинного пути равна 5. Это не может случается, потому что BFS от узла 6 никогда не даст узел 2 как узел на максимальном расстоянии.
Надеюсь, это поможет.
источник
Вот доказательство, которое следует за множеством решений MIT, более тесно связанным с исходным вопросом. Для ясности я буду использовать те же обозначения, которые они используют, чтобы сравнение было легче сделать.
Предположим, у нас есть две вершины и b, такие, что расстояние между a и b на пути p ( a , b ) является диаметром, например, расстояние d ( a , b ) является максимально возможным расстоянием между любыми двумя точками в дереве. Предположим, у нас также есть узел s ≠ a , b (если s = a , тогда будет очевидно, что схема работает, поскольку первая BFS получит b , а вторая вернется к a). Предположим также, что у нас есть узелa б a б р ( а , б ) d( а , б ) s ≠ a , b с = а б такое, что d ( s , u ) = max x d ( s , x ) .U d( s , u ) = максИксd( с , х )
Лемма 0: и и b являются листовыми узлами.a б
Доказательство: если бы они не были листовыми узлами, мы могли бы увеличить , расширив конечные точки до конечных узлов, что противоречит d ( a , b ) диаметру.d( а , б ) d( а , б )
Лемма 1: .макс [ д( с , а ) , д( с , б ) ] = д( с , у )
Доказательство. Предположим, что и d ( s , b ) строго меньше, чем d ( s).d( с , а ) d( с , б ) . Мы рассмотрим два случая:d( с , у )
Случай 1: путь вовсе не содержит вершину s . В этом случае d ( a , b ) не может быть диаметром. Чтобы понять почему, пусть t будет единственной вершиной на p ( a , b ) с наименьшим расстоянием до s . Тогда мы видим, что d ( a , u ) = d ( a , t ) + d ( t , sр ( а , б ) s d( а , б ) T р ( а , б ) s , поскольку d ( s , u ) > d ( s , b ) = d ( s , t ) + d ( t ,d( a , u ) = d( а , т ) + д( т , с ) + д( s , u ) >d( а , б ) =d( а , т ) + д( т , б ) . Точно так же мы бы также имели d ( b , u ) > d ( a , b ) . Это противоречит тому, что d ( a , b ) - диаметр.d( s , u ) > d( с , б ) = д( с , т ) + д( т , б ) > д( т , б ) d( б , у ) > д( а , б ) d( а , б )
Случай 2: путь содержит вершину s . В этом случае d ( a , b ) снова не может быть диаметром, так как для некоторой вершины u такой, что d ( s , u ) = max x d ( s , x ) , оба d ( a , u ) и d ( b) , у ) будет больше, чем гр ( а , б ) s d( а , б ) U d( s , u ) = максИксd( с , х ) d( а , ты ) d( б , ты ) .d( а , б )
Лемма 1 дает причину, по которой мы начинаем второй поиск в ширину в последней обнаруженной вершине первой BFS. Если u - единственная вершина с максимально возможным расстоянием от s , то по лемме 1 она должна быть одной из конечных точек некоторого пути с расстоянием, равным диаметру, и, следовательно, второй BFS с u в качестве корня однозначно находит диаметр. С другой стороны, если существует хотя бы одна другая вершина v такая, что d ( s , v ) = d ( s , u ) , то мы знаем, что диаметр равен dU U s U v d( s , v ) = d( с , у ) , и не имеет значения, начинаем ли мы второй BFS с u или v .d( а , б ) = 2 д( с , у ) U v
источник
Сначала запустите DFS из случайного узла, затем диаметр дерева - это путь между самыми глубокими листьями узла в его поддереве DFS:
источник
По определению BFS, расстояние (от начального узла) каждого исследуемого узла либо равно расстоянию от предыдущего исследуемого узла, либо больше на 1. Таким образом, последний узел, исследуемый BFS, будет одним из самых дальних от начального узел.
источник
Одна ключевая вещь, которую нужно знать, это то, что дерево всегда плоское, а это значит, что оно может быть выложено на плоскости, поэтому часто работает обычное двумерное мышление. В этом случае алгоритм говорит, что начиная с любого места, уходите как можно дальше. Расстояние от этой точки до максимально возможного расстояния от нее - самое длинное расстояние в дереве и, следовательно, диаметр.
Этот метод также будет работать для определения диаметра реального физического острова, если мы определим его как диаметр наименьшего круга, который полностью охватит остров.
источник
@op, способ определения случаев в PDF может быть немного неправильным.
Я думаю, что два случая должны быть:
Остальная часть доказательства в PDF должна следовать.
С этим определением фигура, показанная OP, попадает в Случай 2.
источник