Алгоритмы на деревьях — различия между версиями
Kano vas (обсуждение | вклад) |
Kano vas (обсуждение | вклад) |
||
Строка 5: | Строка 5: | ||
'''Диаметр дерева''' — максимальная длина (в рёбрах) кратчайшего пути между любыми двумя вершинами. | '''Диаметр дерева''' — максимальная длина (в рёбрах) кратчайшего пути между любыми двумя вершинами. | ||
− | Пусть дан граф <tex>G = \langle V, E \rangle </tex> Тогда диаметром <tex>d</tex> называется <tex>\max\limits_{u, v \in V} dist(v, u)</tex>, где <tex>dist</tex> — кратчайшее расстояние между вершинами. | + | Пусть дан граф <tex>G = \langle V, E \rangle </tex>. Тогда диаметром <tex>d</tex> называется <tex>\max\limits_{u, v \in V} dist(v, u)</tex>, где <tex>dist</tex> — кратчайшее расстояние между вершинами. |
=== Алгоритм === | === Алгоритм === | ||
Строка 12: | Строка 12: | ||
Возьмём вершину <tex> u \in V </tex> такую, что <tex>d[u] \ge d[t]</tex> для любого <tex>t</tex>. Снова найдём расстояние от <tex>u</tex> до всех остальных вершин. Самое большое расстояние — диаметр дерева. | Возьмём вершину <tex> u \in V </tex> такую, что <tex>d[u] \ge d[t]</tex> для любого <tex>t</tex>. Снова найдём расстояние от <tex>u</tex> до всех остальных вершин. Самое большое расстояние — диаметр дерева. | ||
− | Расстояние до остальных вершин будем искать алгоритмом <tex>BFS</tex>. | + | Расстояние до остальных вершин будем искать [[Обход_в_ширину|алгоритмом <tex>BFS</tex>]]. |
=== Реализация === | === Реализация === | ||
Строка 54: | Строка 54: | ||
Пусть нет, тогда, взяв расстояние от <tex>w</tex> до глубочайшего листа, мы можем улучшить ответ. | Пусть нет, тогда, взяв расстояние от <tex>w</tex> до глубочайшего листа, мы можем улучшить ответ. | ||
− | Таким образом мы доказали, что нам нужно взять вершину <tex>u</tex> с наибольшей глубиной после первого <tex> | + | Таким образом мы доказали, что нам нужно взять вершину <tex>u</tex> с наибольшей глубиной после первого <tex>BFS</tex>, очевидно, что ей в пару надо сопоставить вершину <tex>w</tex>, такую что <tex>dist(u, w)</tex> максимально. Вершину <tex>w</tex> можно найти запуском <tex>BFS</tex> из <tex>u</tex>. |
=== Оценка производительности === | === Оценка производительности === | ||
Строка 60: | Строка 60: | ||
<tex>BFS</tex> работает за линейное время, запускаем мы его 2 раза. Получаем <tex>O(V + E)</tex>. | <tex>BFS</tex> работает за линейное время, запускаем мы его 2 раза. Получаем <tex>O(V + E)</tex>. | ||
+ | == Центр дерева == | ||
+ | |||
+ | == См. также == | ||
+ | *[[Дерево,_эквивалентные_определения|Дерево, эквивалентные определения]] | ||
+ | *[[Дополнительный,_самодополнительный_граф|Дополнительный, самодополнительный граф]] | ||
== Источники информации == | == Источники информации == |
Версия 23:08, 10 января 2015
Содержание
Диаметр дерева
Диаметр дерева — максимальная длина (в рёбрах) кратчайшего пути между любыми двумя вершинами.
Пусть дан граф
. Тогда диаметром называется , где — кратчайшее расстояние между вершинами.Алгоритм
Возьмём любую вершину
и найдём расстояния до всех других вершин.Возьмём вершину алгоритмом .
такую, что для любого . Снова найдём расстояние от до всех остальных вершин. Самое большое расстояние — диаметр дерева. Расстояние до остальных вершин будем искатьРеализация
int diameterTree(graph g) v = u = w = 0; d = bfs(g, v); for i = 0; i < n; i++ if d[i] > d[u] u = i; bfs(g, u); for i = 0; i < n; i++ if d[i] > d[w] w = i; return d[w];
Обоснование корректности
Будем пользоваться свойством, что в любом дереве больше одного листа. Исключительный случай — дерево из одной вершины, но алгоритм сработает верно и в этом случае.
Теорема: |
Искомое расстояние — расстояние между двумя листами. |
Доказательство: |
Пусть искомое расстояние — расстояние между вершинами | , где не является листом. Так как не является листом, то её степень больше единицы, следовательно, из неё существует ребро в непосещённую вершину (дважды посетить вершину мы не можем).
После запуска алгоритма получим дерево
.Теорема: |
В дереве не существует ребер между вершинами из разных поддеревьев некоторого их общего предка. |
Доказательство: |
Предположим, существует ребро Рассмотрим первую вершину, в которую приведет наш алгоритм, пусть это вершина между соседними поддеревьями: , тогда в ходе рассмотрения всех смежных вершин мы добавим в список вершину , тем самым исключив возможность попадания их в разные поддеревья. |
Мы свели задачу к нахождению вершины , такой что сумма глубин поддеревьев максимальна.
Докажем, что одно из искомых поддеревьев содержит самый глубокий лист. Пусть нет, тогда, взяв расстояние от
до глубочайшего листа, мы можем улучшить ответ.Таким образом мы доказали, что нам нужно взять вершину
с наибольшей глубиной после первого , очевидно, что ей в пару надо сопоставить вершину , такую что максимально. Вершину можно найти запуском из .Оценка производительности
Все операции кроме
— . работает за линейное время, запускаем мы его 2 раза. Получаем .Центр дерева
См. также
Источники информации
- Wikipedia — Distance (graph theory)
- Ф. Харари: Теория графов