<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
		<id>http://neerc.ifmo.ru/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Acherepkov</id>
		<title>Викиконспекты - Вклад участника [ru]</title>
		<link rel="self" type="application/atom+xml" href="http://neerc.ifmo.ru/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Acherepkov"/>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A1%D0%BB%D1%83%D0%B6%D0%B5%D0%B1%D0%BD%D0%B0%D1%8F:%D0%92%D0%BA%D0%BB%D0%B0%D0%B4/Acherepkov"/>
		<updated>2026-09-11T03:13:58Z</updated>
		<subtitle>Вклад участника</subtitle>
		<generator>MediaWiki 1.30.0</generator>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC%D1%8B_%D0%BD%D0%B0_%D0%B4%D0%B5%D1%80%D0%B5%D0%B2%D1%8C%D1%8F%D1%85&amp;diff=61424</id>
		<title>Алгоритмы на деревьях</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC%D1%8B_%D0%BD%D0%B0_%D0%B4%D0%B5%D1%80%D0%B5%D0%B2%D1%8C%D1%8F%D1%85&amp;diff=61424"/>
				<updated>2017-06-08T13:09:56Z</updated>
		
		<summary type="html">&lt;p&gt;Acherepkov: /* Определения */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__TOC__&lt;br /&gt;
&lt;br /&gt;
== Диаметр дерева ==&lt;br /&gt;
{{Определение&lt;br /&gt;
|id = tree&lt;br /&gt;
|definition =&lt;br /&gt;
'''Диаметр дерева''' (англ. ''diameter of a tree'') — максимальная длина (в рёбрах) кратчайшего пути в дереве между любыми двумя вершинами.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Пусть дан граф &amp;lt;tex&amp;gt;G = \langle V, E \rangle &amp;lt;/tex&amp;gt;. Тогда диаметром &amp;lt;tex&amp;gt;d&amp;lt;/tex&amp;gt; называется &amp;lt;tex&amp;gt;\max\limits_{u, v \in V} dist(v, u)&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;dist&amp;lt;/tex&amp;gt; — кратчайшее расстояние между вершинами.&lt;br /&gt;
&lt;br /&gt;
=== Алгоритм ===&lt;br /&gt;
* Возьмём любую вершину &amp;lt;tex&amp;gt; v \in V &amp;lt;/tex&amp;gt; и найдём расстояния до всех других вершин. &amp;lt;tex&amp;gt;d[i] = dist(v, i)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Возьмём вершину &amp;lt;tex&amp;gt; u \in V &amp;lt;/tex&amp;gt; такую, что &amp;lt;tex&amp;gt;d[u] \geqslant d[t]&amp;lt;/tex&amp;gt; для любого &amp;lt;tex&amp;gt;t&amp;lt;/tex&amp;gt;. Снова найдём расстояние от &amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt; до всех остальных вершин. Самое большое расстояние — диаметр дерева.&lt;br /&gt;
Расстояние до остальных вершин будем искать [[Обход_в_ширину|алгоритмом &amp;lt;tex&amp;gt;BFS&amp;lt;/tex&amp;gt;]].&lt;br /&gt;
&lt;br /&gt;
=== Реализация ===&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;//граф g представлен списком смежности&amp;lt;/span&amp;gt; &lt;br /&gt;
 '''int''' diameterTree('''list&amp;lt;list&amp;lt;int&amp;gt;&amp;gt;''' g):        &lt;br /&gt;
     v = u = w = 0&lt;br /&gt;
     d = bfs(g, v)&lt;br /&gt;
     '''for''' i = 0, i &amp;lt; n, i++&lt;br /&gt;
          '''if''' d[i] &amp;gt; d[u]&lt;br /&gt;
               u = i&lt;br /&gt;
     bfs(g, u)&lt;br /&gt;
     '''for''' i = 0, i &amp;lt; n, i++&lt;br /&gt;
           '''if''' d[i] &amp;gt; d[w]&lt;br /&gt;
                w = i&lt;br /&gt;
     '''return''' d[w]&lt;br /&gt;
&lt;br /&gt;
=== Обоснование корректности ===&lt;br /&gt;
Будем пользоваться свойством, что в любом дереве больше одного листа. Исключительный случай — дерево из одной вершины, но алгоритм сработает верно и в этом случае.&lt;br /&gt;
&lt;br /&gt;
{{Теорема&lt;br /&gt;
|statement=&lt;br /&gt;
Искомое расстояние — расстояние между двумя листами.&lt;br /&gt;
|proof=&lt;br /&gt;
Пусть искомое расстояние — расстояние между вершинами &amp;lt;tex&amp;gt;a, b&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;b&amp;lt;/tex&amp;gt; не является листом. Так как &amp;lt;tex&amp;gt;b&amp;lt;/tex&amp;gt; не является листом, то её степень больше единицы, следовательно, из неё существует ребро в непосещённую вершину (дважды посетить вершину &amp;lt;tex&amp;gt;b&amp;lt;/tex&amp;gt; мы не можем).&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
После запуска алгоритма получим дерево &amp;lt;tex&amp;gt;BFS&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
{{Теорема&lt;br /&gt;
|statement=&lt;br /&gt;
В дереве &amp;lt;tex&amp;gt;BFS&amp;lt;/tex&amp;gt; не существует ребер между вершинами из разных поддеревьев некоторого их общего предка.&lt;br /&gt;
|proof=&lt;br /&gt;
Предположим, существует ребро &amp;lt;tex&amp;gt;u, v&amp;lt;/tex&amp;gt; между соседними поддеревьями:&lt;br /&gt;
Рассмотрим первую вершину, в которую приведет наш алгоритм, пусть это вершина &amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt;, тогда в ходе рассмотрения всех смежных вершин &amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt; мы добавим в список вершину &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt;, тем самым исключив возможность попадания их в разные поддеревья.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Мы свели задачу к нахождению вершины &amp;lt;tex&amp;gt;w&amp;lt;/tex&amp;gt;, такой что сумма глубин поддеревьев максимальна.&lt;br /&gt;
&lt;br /&gt;
Докажем, что одно из искомых поддеревьев содержит самый глубокий лист. &lt;br /&gt;
Пусть нет, тогда, взяв расстояние от &amp;lt;tex&amp;gt;w&amp;lt;/tex&amp;gt; до глубочайшего листа, мы можем улучшить ответ. &lt;br /&gt;
&lt;br /&gt;
Таким образом мы доказали, что нам нужно взять вершину &amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt; с наибольшей глубиной после первого &amp;lt;tex&amp;gt;BFS&amp;lt;/tex&amp;gt;, очевидно, что ей в пару надо сопоставить вершину &amp;lt;tex&amp;gt;w&amp;lt;/tex&amp;gt;, такую что &amp;lt;tex&amp;gt;dist(u, w)&amp;lt;/tex&amp;gt; максимально. Вершину &amp;lt;tex&amp;gt;w&amp;lt;/tex&amp;gt; можно найти запуском &amp;lt;tex&amp;gt;BFS&amp;lt;/tex&amp;gt; из &amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
=== Оценка времени работы ===&lt;br /&gt;
Все операции кроме &amp;lt;tex&amp;gt;BFS&amp;lt;/tex&amp;gt; — &amp;lt;tex&amp;gt;O(1)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&amp;lt;tex&amp;gt;BFS&amp;lt;/tex&amp;gt; работает за линейное время, запускаем мы его два раза. Получаем &amp;lt;tex&amp;gt;O(|V| + |E|)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Центр дерева ==&lt;br /&gt;
=== Определения ===&lt;br /&gt;
{{Определение&lt;br /&gt;
|id = tree&lt;br /&gt;
|definition =&lt;br /&gt;
'''Эксцентриситет вершины &amp;lt;tex&amp;gt;e(v)&amp;lt;/tex&amp;gt;''' (англ. ''eccentricity of a vertex'') — &amp;lt;tex&amp;gt;\max\limits_{u\in V} dist(v, u)&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;V&amp;lt;/tex&amp;gt; — множество вершин связного графа &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
{{Определение&lt;br /&gt;
|id = tree&lt;br /&gt;
|definition =&lt;br /&gt;
'''Радиус &amp;lt;tex&amp;gt;r(G)&amp;lt;/tex&amp;gt;''' (англ. ''radius'') — наименьший из эксцентриситетов вершин графа &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
{{Определение&lt;br /&gt;
|id = tree&lt;br /&gt;
|definition =&lt;br /&gt;
'''Центральная вершина''' (англ. ''central vertex'') — вершина графа &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;, такая что &amp;lt;tex&amp;gt;e(v) = r(G)&amp;lt;/tex&amp;gt; &lt;br /&gt;
}}&lt;br /&gt;
{{Определение&lt;br /&gt;
|id = tree&lt;br /&gt;
|definition =&lt;br /&gt;
'''Центр графа &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;''' (англ. ''center of a graph'') — множество всех центральных вершин графа &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
[[Файл:Центральные_вершины.png|300px|thumb|left|Примеры деревьев с одной и двумя центральными вершинами]]&lt;br /&gt;
[[Файл:Эксцентриситеты.png|400px|thumb|center|Графы, у которых показан эксцентриситет каждой вершины]]&lt;br /&gt;
&lt;br /&gt;
=== Алгоритм ===&lt;br /&gt;
==== Наивный алгоритм ====&lt;br /&gt;
Найдём центр графа исходя из его определения.&lt;br /&gt;
* Построим матрицу &amp;lt;tex&amp;gt;A_{n \times n}&amp;lt;/tex&amp;gt; (&amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; — мощность множества &amp;lt;tex&amp;gt;V&amp;lt;/tex&amp;gt;), где &amp;lt;tex&amp;gt;a_{ij} = d_{ij}&amp;lt;/tex&amp;gt;, то есть матрицу кратчайших путей. Для её построения можно воспользоваться [[Алгоритм_Флойда|алгоритмом Флойда-Уоршелла]] или [[Алгоритм_Дейкстры|Дейкстры]].&lt;br /&gt;
* Подсчитаем максимум в каждой строчке матрицы &amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt;. Таким образом, получим массив длины &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt;.&lt;br /&gt;
* Найдём наименьший элемент в этом массиве. Эта вершина и есть центр графа. В том случае, когда вершин несколько, все они являются центрами. &lt;br /&gt;
Асимптотика зависит от используемого способа подсчета кратчайших путей. При Флойде это будет &amp;lt;tex&amp;gt;O(V^3)&amp;lt;/tex&amp;gt;, а при Дейкстре — максимум из асимптотики конкретной реализации Дейкстры и &amp;lt;tex&amp;gt;O(V^2)&amp;lt;/tex&amp;gt;, за которую мы находим максимумы в матрице.&lt;br /&gt;
&lt;br /&gt;
==== Алгоритм для дерева за O(n) ====&lt;br /&gt;
&lt;br /&gt;
{{Теорема&lt;br /&gt;
|statement=&lt;br /&gt;
Каждое дерево имеет центр, состоящий из одной вершины или из двух смежных вершин. &lt;br /&gt;
|proof=&lt;br /&gt;
Утверждение очевидно для деревьев с одной и двумя вершинами. Покажем, что у любого другого дерева &amp;lt;tex&amp;gt;T&amp;lt;/tex&amp;gt; те же центральные вершины, что и у дерева &amp;lt;tex&amp;gt;T'&amp;lt;/tex&amp;gt;, полученного из &amp;lt;tex&amp;gt;T&amp;lt;/tex&amp;gt; удалением всех его висячих вершин. Расстояние от данной вершины дерева &amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt; до любой другой вершины &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt; достигает наибольшего значения, когда &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt; – висячая вершина. Таким образом, эксцентриситет каждой вершины дерева &amp;lt;tex&amp;gt;T'&amp;lt;/tex&amp;gt; точно на единицу меньше эксцентриситета этой же вершины в дереве &amp;lt;tex&amp;gt;T&amp;lt;/tex&amp;gt;, следовательно, центры этих деревьев совпадают. Продолжим процесс удаления и получим требуемое.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Собственно, алгоритм нахождения центра описан в доказательстве теоремы.&lt;br /&gt;
&lt;br /&gt;
* Пройдёмся по дереву [[Обход_в_глубину,_цвета_вершин|обходом в глубину]] и пометим все висячие вершины числом &amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt;.&lt;br /&gt;
* Обрежем помеченные вершины.&lt;br /&gt;
* Образовавшиеся листья пометим числом &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt; и тоже обрежем.&lt;br /&gt;
* Будем повторять, пока на текущей глубине не окажется не более двух листьев, и при этом в дереве будет тоже не более двух листьев. &lt;br /&gt;
&lt;br /&gt;
Оставшиеся листья являются центром дерева.&lt;br /&gt;
&lt;br /&gt;
Для того, чтобы алгоритм работал за &amp;lt;tex&amp;gt;O(n)&amp;lt;/tex&amp;gt;, нужно обрабатывать листья по одному, поддерживая в [[Очередь|очереди]] два последовательных по глубине слоя.&lt;br /&gt;
&lt;br /&gt;
== См. также ==&lt;br /&gt;
*[[Дерево,_эквивалентные_определения|Дерево, эквивалентные определения]]&lt;br /&gt;
*[[Дополнительный,_самодополнительный_граф|Дополнительный, самодополнительный граф]]&lt;br /&gt;
&lt;br /&gt;
== Источники информации ==&lt;br /&gt;
* [[wikipedia:Distance_(graph_theory)|Wikipedia {{---}} Distance (graph theory)]]&lt;br /&gt;
* ''Ф. Харари'': Теория графов&lt;br /&gt;
* [http://rain.ifmo.ru/cat/data/theory/graph-location/centers-2006/article.pdf ''А. Клебанов'': Центры графов]&lt;br /&gt;
&lt;br /&gt;
[[Категория: Дискретная математика и алгоритмы]]&lt;br /&gt;
[[Категория: Основные определения теории графов]]&lt;/div&gt;</summary>
		<author><name>Acherepkov</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC%D1%8B_%D0%BD%D0%B0_%D0%B4%D0%B5%D1%80%D0%B5%D0%B2%D1%8C%D1%8F%D1%85&amp;diff=61423</id>
		<title>Алгоритмы на деревьях</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC%D1%8B_%D0%BD%D0%B0_%D0%B4%D0%B5%D1%80%D0%B5%D0%B2%D1%8C%D1%8F%D1%85&amp;diff=61423"/>
				<updated>2017-06-08T13:05:29Z</updated>
		
		<summary type="html">&lt;p&gt;Acherepkov: /* Алгоритм */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__TOC__&lt;br /&gt;
&lt;br /&gt;
== Диаметр дерева ==&lt;br /&gt;
{{Определение&lt;br /&gt;
|id = tree&lt;br /&gt;
|definition =&lt;br /&gt;
'''Диаметр дерева''' (англ. ''diameter of a tree'') — максимальная длина (в рёбрах) кратчайшего пути в дереве между любыми двумя вершинами.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Пусть дан граф &amp;lt;tex&amp;gt;G = \langle V, E \rangle &amp;lt;/tex&amp;gt;. Тогда диаметром &amp;lt;tex&amp;gt;d&amp;lt;/tex&amp;gt; называется &amp;lt;tex&amp;gt;\max\limits_{u, v \in V} dist(v, u)&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;dist&amp;lt;/tex&amp;gt; — кратчайшее расстояние между вершинами.&lt;br /&gt;
&lt;br /&gt;
=== Алгоритм ===&lt;br /&gt;
* Возьмём любую вершину &amp;lt;tex&amp;gt; v \in V &amp;lt;/tex&amp;gt; и найдём расстояния до всех других вершин. &amp;lt;tex&amp;gt;d[i] = dist(v, i)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Возьмём вершину &amp;lt;tex&amp;gt; u \in V &amp;lt;/tex&amp;gt; такую, что &amp;lt;tex&amp;gt;d[u] \geqslant d[t]&amp;lt;/tex&amp;gt; для любого &amp;lt;tex&amp;gt;t&amp;lt;/tex&amp;gt;. Снова найдём расстояние от &amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt; до всех остальных вершин. Самое большое расстояние — диаметр дерева.&lt;br /&gt;
Расстояние до остальных вершин будем искать [[Обход_в_ширину|алгоритмом &amp;lt;tex&amp;gt;BFS&amp;lt;/tex&amp;gt;]].&lt;br /&gt;
&lt;br /&gt;
=== Реализация ===&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;//граф g представлен списком смежности&amp;lt;/span&amp;gt; &lt;br /&gt;
 '''int''' diameterTree('''list&amp;lt;list&amp;lt;int&amp;gt;&amp;gt;''' g):        &lt;br /&gt;
     v = u = w = 0&lt;br /&gt;
     d = bfs(g, v)&lt;br /&gt;
     '''for''' i = 0, i &amp;lt; n, i++&lt;br /&gt;
          '''if''' d[i] &amp;gt; d[u]&lt;br /&gt;
               u = i&lt;br /&gt;
     bfs(g, u)&lt;br /&gt;
     '''for''' i = 0, i &amp;lt; n, i++&lt;br /&gt;
           '''if''' d[i] &amp;gt; d[w]&lt;br /&gt;
                w = i&lt;br /&gt;
     '''return''' d[w]&lt;br /&gt;
&lt;br /&gt;
=== Обоснование корректности ===&lt;br /&gt;
Будем пользоваться свойством, что в любом дереве больше одного листа. Исключительный случай — дерево из одной вершины, но алгоритм сработает верно и в этом случае.&lt;br /&gt;
&lt;br /&gt;
{{Теорема&lt;br /&gt;
|statement=&lt;br /&gt;
Искомое расстояние — расстояние между двумя листами.&lt;br /&gt;
|proof=&lt;br /&gt;
Пусть искомое расстояние — расстояние между вершинами &amp;lt;tex&amp;gt;a, b&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;b&amp;lt;/tex&amp;gt; не является листом. Так как &amp;lt;tex&amp;gt;b&amp;lt;/tex&amp;gt; не является листом, то её степень больше единицы, следовательно, из неё существует ребро в непосещённую вершину (дважды посетить вершину &amp;lt;tex&amp;gt;b&amp;lt;/tex&amp;gt; мы не можем).&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
После запуска алгоритма получим дерево &amp;lt;tex&amp;gt;BFS&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
{{Теорема&lt;br /&gt;
|statement=&lt;br /&gt;
В дереве &amp;lt;tex&amp;gt;BFS&amp;lt;/tex&amp;gt; не существует ребер между вершинами из разных поддеревьев некоторого их общего предка.&lt;br /&gt;
|proof=&lt;br /&gt;
Предположим, существует ребро &amp;lt;tex&amp;gt;u, v&amp;lt;/tex&amp;gt; между соседними поддеревьями:&lt;br /&gt;
Рассмотрим первую вершину, в которую приведет наш алгоритм, пусть это вершина &amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt;, тогда в ходе рассмотрения всех смежных вершин &amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt; мы добавим в список вершину &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt;, тем самым исключив возможность попадания их в разные поддеревья.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Мы свели задачу к нахождению вершины &amp;lt;tex&amp;gt;w&amp;lt;/tex&amp;gt;, такой что сумма глубин поддеревьев максимальна.&lt;br /&gt;
&lt;br /&gt;
Докажем, что одно из искомых поддеревьев содержит самый глубокий лист. &lt;br /&gt;
Пусть нет, тогда, взяв расстояние от &amp;lt;tex&amp;gt;w&amp;lt;/tex&amp;gt; до глубочайшего листа, мы можем улучшить ответ. &lt;br /&gt;
&lt;br /&gt;
Таким образом мы доказали, что нам нужно взять вершину &amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt; с наибольшей глубиной после первого &amp;lt;tex&amp;gt;BFS&amp;lt;/tex&amp;gt;, очевидно, что ей в пару надо сопоставить вершину &amp;lt;tex&amp;gt;w&amp;lt;/tex&amp;gt;, такую что &amp;lt;tex&amp;gt;dist(u, w)&amp;lt;/tex&amp;gt; максимально. Вершину &amp;lt;tex&amp;gt;w&amp;lt;/tex&amp;gt; можно найти запуском &amp;lt;tex&amp;gt;BFS&amp;lt;/tex&amp;gt; из &amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
=== Оценка времени работы ===&lt;br /&gt;
Все операции кроме &amp;lt;tex&amp;gt;BFS&amp;lt;/tex&amp;gt; — &amp;lt;tex&amp;gt;O(1)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&amp;lt;tex&amp;gt;BFS&amp;lt;/tex&amp;gt; работает за линейное время, запускаем мы его два раза. Получаем &amp;lt;tex&amp;gt;O(|V| + |E|)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Центр дерева ==&lt;br /&gt;
=== Определения ===&lt;br /&gt;
{{Определение&lt;br /&gt;
|id = tree&lt;br /&gt;
|definition =&lt;br /&gt;
'''Эксцентриситет вершины &amp;lt;tex&amp;gt;e(v)&amp;lt;/tex&amp;gt;''' (англ. ''eccentricity of a vertex'') — &amp;lt;tex&amp;gt;\max\limits_{u, v \in V} dist(v, u)&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;V&amp;lt;/tex&amp;gt; — множество вершин связного графа &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
{{Определение&lt;br /&gt;
|id = tree&lt;br /&gt;
|definition =&lt;br /&gt;
'''Радиус &amp;lt;tex&amp;gt;r(G)&amp;lt;/tex&amp;gt;''' (англ. ''radius'') — наименьший из эксцентриситетов вершин графа &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
{{Определение&lt;br /&gt;
|id = tree&lt;br /&gt;
|definition =&lt;br /&gt;
'''Центральная вершина''' (англ. ''central vertex'') — вершина графа &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;, такая что &amp;lt;tex&amp;gt;e(v) = r(G)&amp;lt;/tex&amp;gt; &lt;br /&gt;
}}&lt;br /&gt;
{{Определение&lt;br /&gt;
|id = tree&lt;br /&gt;
|definition =&lt;br /&gt;
'''Центр графа &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;''' (англ. ''center of a graph'') — множество всех центральных вершин графа &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
[[Файл:Центральные_вершины.png|300px|thumb|left|Примеры деревьев с одной и двумя центральными вершинами]]&lt;br /&gt;
[[Файл:Эксцентриситеты.png|400px|thumb|center|Графы, у которых показан эксцентриситет каждой вершины]]&lt;br /&gt;
&lt;br /&gt;
=== Алгоритм ===&lt;br /&gt;
==== Наивный алгоритм ====&lt;br /&gt;
Найдём центр графа исходя из его определения.&lt;br /&gt;
* Построим матрицу &amp;lt;tex&amp;gt;A_{n \times n}&amp;lt;/tex&amp;gt; (&amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; — мощность множества &amp;lt;tex&amp;gt;V&amp;lt;/tex&amp;gt;), где &amp;lt;tex&amp;gt;a_{ij} = d_{ij}&amp;lt;/tex&amp;gt;, то есть матрицу кратчайших путей. Для её построения можно воспользоваться [[Алгоритм_Флойда|алгоритмом Флойда-Уоршелла]] или [[Алгоритм_Дейкстры|Дейкстры]].&lt;br /&gt;
* Подсчитаем максимум в каждой строчке матрицы &amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt;. Таким образом, получим массив длины &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt;.&lt;br /&gt;
* Найдём наименьший элемент в этом массиве. Эта вершина и есть центр графа. В том случае, когда вершин несколько, все они являются центрами. &lt;br /&gt;
Асимптотика зависит от используемого способа подсчета кратчайших путей. При Флойде это будет &amp;lt;tex&amp;gt;O(V^3)&amp;lt;/tex&amp;gt;, а при Дейкстре — максимум из асимптотики конкретной реализации Дейкстры и &amp;lt;tex&amp;gt;O(V^2)&amp;lt;/tex&amp;gt;, за которую мы находим максимумы в матрице.&lt;br /&gt;
&lt;br /&gt;
==== Алгоритм для дерева за O(n) ====&lt;br /&gt;
&lt;br /&gt;
{{Теорема&lt;br /&gt;
|statement=&lt;br /&gt;
Каждое дерево имеет центр, состоящий из одной вершины или из двух смежных вершин. &lt;br /&gt;
|proof=&lt;br /&gt;
Утверждение очевидно для деревьев с одной и двумя вершинами. Покажем, что у любого другого дерева &amp;lt;tex&amp;gt;T&amp;lt;/tex&amp;gt; те же центральные вершины, что и у дерева &amp;lt;tex&amp;gt;T'&amp;lt;/tex&amp;gt;, полученного из &amp;lt;tex&amp;gt;T&amp;lt;/tex&amp;gt; удалением всех его висячих вершин. Расстояние от данной вершины дерева &amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt; до любой другой вершины &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt; достигает наибольшего значения, когда &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt; – висячая вершина. Таким образом, эксцентриситет каждой вершины дерева &amp;lt;tex&amp;gt;T'&amp;lt;/tex&amp;gt; точно на единицу меньше эксцентриситета этой же вершины в дереве &amp;lt;tex&amp;gt;T&amp;lt;/tex&amp;gt;, следовательно, центры этих деревьев совпадают. Продолжим процесс удаления и получим требуемое.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Собственно, алгоритм нахождения центра описан в доказательстве теоремы.&lt;br /&gt;
&lt;br /&gt;
* Пройдёмся по дереву [[Обход_в_глубину,_цвета_вершин|обходом в глубину]] и пометим все висячие вершины числом &amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt;.&lt;br /&gt;
* Обрежем помеченные вершины.&lt;br /&gt;
* Образовавшиеся листья пометим числом &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt; и тоже обрежем.&lt;br /&gt;
* Будем повторять, пока на текущей глубине не окажется не более двух листьев, и при этом в дереве будет тоже не более двух листьев. &lt;br /&gt;
&lt;br /&gt;
Оставшиеся листья являются центром дерева.&lt;br /&gt;
&lt;br /&gt;
Для того, чтобы алгоритм работал за &amp;lt;tex&amp;gt;O(n)&amp;lt;/tex&amp;gt;, нужно обрабатывать листья по одному, поддерживая в [[Очередь|очереди]] два последовательных по глубине слоя.&lt;br /&gt;
&lt;br /&gt;
== См. также ==&lt;br /&gt;
*[[Дерево,_эквивалентные_определения|Дерево, эквивалентные определения]]&lt;br /&gt;
*[[Дополнительный,_самодополнительный_граф|Дополнительный, самодополнительный граф]]&lt;br /&gt;
&lt;br /&gt;
== Источники информации ==&lt;br /&gt;
* [[wikipedia:Distance_(graph_theory)|Wikipedia {{---}} Distance (graph theory)]]&lt;br /&gt;
* ''Ф. Харари'': Теория графов&lt;br /&gt;
* [http://rain.ifmo.ru/cat/data/theory/graph-location/centers-2006/article.pdf ''А. Клебанов'': Центры графов]&lt;br /&gt;
&lt;br /&gt;
[[Категория: Дискретная математика и алгоритмы]]&lt;br /&gt;
[[Категория: Основные определения теории графов]]&lt;/div&gt;</summary>
		<author><name>Acherepkov</name></author>	</entry>

	</feed>