Алгоритмы на деревьях — различия между версиями
Shersh (обсуждение | вклад) (→Оценка производительности) |
Kano vas (обсуждение | вклад) |
||
Строка 2: | Строка 2: | ||
== Диаметр дерева == | == Диаметр дерева == | ||
− | + | {{Определение | |
− | '''Диаметр дерева''' — максимальная длина (в рёбрах) кратчайшего пути между любыми двумя вершинами. | + | |id = tree |
+ | |definition = | ||
+ | '''Диаметр дерева''' (''diameter of a tree'') — максимальная длина (в рёбрах) кратчайшего пути в дереве между любыми двумя вершинами. | ||
+ | }} | ||
Пусть дан граф <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> — кратчайшее расстояние между вершинами. | ||
Строка 10: | Строка 13: | ||
* Возьмём любую вершину <tex> v \in V </tex> и найдём расстояния до всех других вершин. <tex>d[i] = \min\limits_{u, i \in V} dist(u, i)</tex> | * Возьмём любую вершину <tex> v \in V </tex> и найдём расстояния до всех других вершин. <tex>d[i] = \min\limits_{u, i \in V} dist(u, i)</tex> | ||
− | * Возьмём вершину <tex> u \in V </tex> такую, что <tex>d[u] \ | + | * Возьмём вершину <tex> u \in V </tex> такую, что <tex>d[u] \geqslant d[t]</tex> для любого <tex>t</tex>. Снова найдём расстояние от <tex>u</tex> до всех остальных вершин. Самое большое расстояние — диаметр дерева. |
Расстояние до остальных вершин будем искать [[Обход_в_ширину|алгоритмом <tex>BFS</tex>]]. | Расстояние до остальных вершин будем искать [[Обход_в_ширину|алгоритмом <tex>BFS</tex>]]. | ||
=== Реализация === | === Реализация === | ||
− | '''int''' diameterTree(graph g) | + | '''int''' diameterTree(graph<node> g) //''тип node содержит поле number, в котором хранится номер вершины в графе'' |
− | v = u = w = 0 | + | v = u = w = 0 |
− | d = bfs(g, v) | + | d = bfs(g, v) |
− | '''for''' i = 0 | + | '''for''' i = 0, i < n, i++ |
'''if''' d[i] > d[u] | '''if''' d[i] > d[u] | ||
− | u = i | + | u = i |
− | bfs(g, u) | + | bfs(g, u) |
− | '''for''' i = 0 | + | '''for''' i = 0, i < n, i++ |
'''if''' d[i] > d[w] | '''if''' d[i] > d[w] | ||
− | w = i | + | w = i |
− | '''return''' d[w] | + | '''return''' d[w] |
=== Обоснование корректности === | === Обоснование корректности === | ||
Строка 55: | Строка 58: | ||
Таким образом мы доказали, что нам нужно взять вершину <tex>u</tex> с наибольшей глубиной после первого <tex>BFS</tex>, очевидно, что ей в пару надо сопоставить вершину <tex>w</tex>, такую что <tex>dist(u, w)</tex> максимально. Вершину <tex>w</tex> можно найти запуском <tex>BFS</tex> из <tex>u</tex>. | Таким образом мы доказали, что нам нужно взять вершину <tex>u</tex> с наибольшей глубиной после первого <tex>BFS</tex>, очевидно, что ей в пару надо сопоставить вершину <tex>w</tex>, такую что <tex>dist(u, w)</tex> максимально. Вершину <tex>w</tex> можно найти запуском <tex>BFS</tex> из <tex>u</tex>. | ||
− | === Оценка | + | === Оценка времени работы === |
Все операции кроме <tex>BFS</tex> — <tex>O(1)</tex>. | Все операции кроме <tex>BFS</tex> — <tex>O(1)</tex>. | ||
− | <tex>BFS</tex> работает за линейное время, запускаем мы его два раза. Получаем <tex>O(V + E)</tex>. | + | <tex>BFS</tex> работает за линейное время, запускаем мы его два раза. Получаем <tex>O(|V| + |E|)</tex>. |
== Центр дерева == | == Центр дерева == | ||
Строка 64: | Строка 67: | ||
|id = tree | |id = tree | ||
|definition = | |definition = | ||
− | '''Эксцентриситет вершины <tex>e(v)</tex>''' — <tex>\max\limits_{u, v \in V} dist(v, u)</tex>, где <tex>V</tex> — множество вершин связного графа <tex>G</tex>. | + | '''Эксцентриситет вершины <tex>e(v)</tex>''' (''eccentricity of a vertex'') — <tex>\max\limits_{u, v \in V} dist(v, u)</tex>, где <tex>V</tex> — множество вершин связного графа <tex>G</tex>. |
}} | }} | ||
{{Определение | {{Определение | ||
|id = tree | |id = tree | ||
|definition = | |definition = | ||
− | '''Радиус <tex>r(G)</tex>''' — наименьший из эксцентриситетов вершин графа <tex>G</tex>. | + | '''Радиус <tex>r(G)</tex>''' (''radius'') — наименьший из эксцентриситетов вершин графа <tex>G</tex>. |
}} | }} | ||
{{Определение | {{Определение | ||
|id = tree | |id = tree | ||
|definition = | |definition = | ||
− | '''Центральная вершина''' — вершина графа <tex>G</tex>, такая что <tex>e(v) = r(G)</tex> | + | '''Центральная вершина''' (''central vertex'') — вершина графа <tex>G</tex>, такая что <tex>e(v) = r(G)</tex> |
}} | }} | ||
{{Определение | {{Определение | ||
|id = tree | |id = tree | ||
|definition = | |definition = | ||
− | '''Центр графа <tex>G</tex>''' — множество всех центральных вершин графа <tex>G</tex>. | + | '''Центр графа <tex>G</tex>''' (''center of a graph'') — множество всех центральных вершин графа <tex>G</tex>. |
}} | }} | ||
[[Файл:Центральные_вершины.png|300px|thumb|left|Примеры деревьев с одной и двумя центральными вершинами]] | [[Файл:Центральные_вершины.png|300px|thumb|left|Примеры деревьев с одной и двумя центральными вершинами]] | ||
Строка 104: | Строка 107: | ||
* [[wikipedia:Distance_(graph_theory)|Wikipedia {{---}} Distance (graph theory)]] | * [[wikipedia:Distance_(graph_theory)|Wikipedia {{---}} Distance (graph theory)]] | ||
* ''Ф. Харари'': Теория графов | * ''Ф. Харари'': Теория графов | ||
− | * http://rain.ifmo.ru/cat/data/theory/graph-location/centers-2006/article.pdf | + | * [http://rain.ifmo.ru/cat/data/theory/graph-location/centers-2006/article.pdf ''А. Клебанов'': Центры графов] |
[[Категория: Дискретная математика и алгоритмы]] | [[Категория: Дискретная математика и алгоритмы]] | ||
[[Категория: Основные определения теории графов]] | [[Категория: Основные определения теории графов]] |
Версия 07:34, 12 января 2015
Содержание
Диаметр дерева
Определение: |
Диаметр дерева (diameter of a tree) — максимальная длина (в рёбрах) кратчайшего пути в дереве между любыми двумя вершинами. |
Пусть дан граф . Тогда диаметром называется , где — кратчайшее расстояние между вершинами.
Алгоритм
- Возьмём любую вершину и найдём расстояния до всех других вершин.
- Возьмём вершину такую, что для любого . Снова найдём расстояние от до всех остальных вершин. Самое большое расстояние — диаметр дерева.
Расстояние до остальных вершин будем искать алгоритмом .
Реализация
int diameterTree(graph<node> g) //тип node содержит поле number, в котором хранится номер вершины в графе 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]
Обоснование корректности
Будем пользоваться свойством, что в любом дереве больше одного листа. Исключительный случай — дерево из одной вершины, но алгоритм сработает верно и в этом случае.
Теорема: |
Искомое расстояние — расстояние между двумя листами. |
Доказательство: |
Пусть искомое расстояние — расстояние между вершинами | , где не является листом. Так как не является листом, то её степень больше единицы, следовательно, из неё существует ребро в непосещённую вершину (дважды посетить вершину мы не можем).
После запуска алгоритма получим дерево
.Теорема: |
В дереве не существует ребер между вершинами из разных поддеревьев некоторого их общего предка. |
Доказательство: |
Предположим, существует ребро Рассмотрим первую вершину, в которую приведет наш алгоритм, пусть это вершина между соседними поддеревьями: , тогда в ходе рассмотрения всех смежных вершин мы добавим в список вершину , тем самым исключив возможность попадания их в разные поддеревья. |
Мы свели задачу к нахождению вершины , такой что сумма глубин поддеревьев максимальна.
Докажем, что одно из искомых поддеревьев содержит самый глубокий лист. Пусть нет, тогда, взяв расстояние от
до глубочайшего листа, мы можем улучшить ответ.Таким образом мы доказали, что нам нужно взять вершину
с наибольшей глубиной после первого , очевидно, что ей в пару надо сопоставить вершину , такую что максимально. Вершину можно найти запуском из .Оценка времени работы
Все операции кроме
— . работает за линейное время, запускаем мы его два раза. Получаем .Центр дерева
Определения
Определение: |
Эксцентриситет вершины | (eccentricity of a vertex) — , где — множество вершин связного графа .
Определение: |
Радиус | (radius) — наименьший из эксцентриситетов вершин графа .
Определение: |
Центральная вершина (central vertex) — вершина графа | , такая что
Определение: |
Центр графа | (center of a graph) — множество всех центральных вершин графа .
Теорема: |
Каждое дерево имеет центр, состоящий из одной вершины или из двух смежных вершин. |
Доказательство: |
Утверждение очевидно для деревьев с одной и двумя вершинами. Покажем, что у любого другого дерева | те же центральные вершины, что и у дерева , полученного из удалением всех его висячих вершин. Расстояние от данной вершины дерева до любой другой вершины достигает наибольшего значения, когда – висячая вершина. Таким образом, эксцентриситет каждой вершины дерева точно на единицу меньше эксцентриситета этой же вершины в дереве , следовательно, центры этих деревьев совпадают. Продолжим процесс удаления и получим требуемое.
Алгоритм
- Построим матрицу алгоритмом Флойда-Уоршелла или Дейкстры. ( — мощность множества ), где , то есть матрицу кратчайших путей. Для её построения можно воспользоваться
- Подсчитаем максимум в каждой строчке матрицы . Таким образом, получим массив длины .
- Найдём наименьший элемент в этом массиве. Эта вершина и есть центр графа. В том случае, когда вершин несколько, все они являются центрами.
Асимптотика зависит от используемого способа подсчета кратчайших путей. При Флойде это будет
, а при Дейкстре — максимум из асимптотики конкретной реализации Дейкстры и , за которую мы находим максимумы в матрице.См. также
Источники информации
- Wikipedia — Distance (graph theory)
- Ф. Харари: Теория графов
- А. Клебанов: Центры графов