<?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=176.59.0.238&amp;*</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=176.59.0.238&amp;*"/>
		<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/176.59.0.238"/>
		<updated>2026-04-23T17:55:40Z</updated>
		<subtitle>Вклад участника</subtitle>
		<generator>MediaWiki 1.30.0</generator>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9C%D0%B8%D0%BD%D0%B8%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE_%D1%83%D0%B7%D0%BA%D0%BE%D0%B5_%D0%BE%D1%81%D1%82%D0%BE%D0%B2%D0%BD%D0%BE%D0%B5_%D0%B4%D0%B5%D1%80%D0%B5%D0%B2%D0%BE&amp;diff=59351</id>
		<title>Минимально узкое остовное дерево</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9C%D0%B8%D0%BD%D0%B8%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE_%D1%83%D0%B7%D0%BA%D0%BE%D0%B5_%D0%BE%D1%81%D1%82%D0%BE%D0%B2%D0%BD%D0%BE%D0%B5_%D0%B4%D0%B5%D1%80%D0%B5%D0%B2%D0%BE&amp;diff=59351"/>
				<updated>2017-01-08T19:01:53Z</updated>
		
		<summary type="html">&lt;p&gt;176.59.0.238: /* Свойства минимального узкого остовного дерева */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Определение&lt;br /&gt;
|definition='''Минимально узкое остовное дерево''' (англ. ''Minimum bottleneck spanning tree'', ''MBST'') в связанном взвешенном неориентированном графе &amp;lt;tex&amp;gt;-&amp;lt;/tex&amp;gt; [[Остовные деревья: определения, лемма о безопасном ребре|остовное дерево]] графа, у которого максимальное ребро минимально.&lt;br /&gt;
}}&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition=Узким ребром в графе назовём максимальное по весу.&lt;br /&gt;
}}&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition=Остовное дерево является минимально узким, если в графе нет остовного дерева с меньшим узким ребром.&lt;br /&gt;
}}&lt;br /&gt;
== Свойства минимального узкого остовного дерева ==&lt;br /&gt;
{{Определение с MBST&lt;br /&gt;
|definition=Каждое минимальное остовное дерево является &amp;lt;tex&amp;gt;\mathrm{MBST}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
|proof=Предположим, если минимальное остовное не является &amp;lt;tex&amp;gt;\mathrm{MBST}&amp;lt;/tex&amp;gt;, значит в графе существует набор ребер которые мы не взяли в наш остов, при замене на которые, наше дерево станет &amp;lt;tex&amp;gt;\mathrm{MBST}&amp;lt;/tex&amp;gt;. Также рёбра вне остова должны быть меньше рёбер из остова, чтобы уменьшить минимальное максимально ребро. Но по определению &amp;lt;tex&amp;gt;\mathrm{MST}&amp;lt;/tex&amp;gt;, сумма рёбер дерева минимальна, значит вне остова нету рёбер с меньшим весом. Так как наше предположение неверно, &amp;lt;tex&amp;gt;\mathrm{MST}&amp;lt;/tex&amp;gt; является &amp;lt;tex&amp;gt;\mathrm{MBST}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
{{Определение с MBST&lt;br /&gt;
|definition=&amp;lt;tex&amp;gt;\mathrm{MBST}&amp;lt;/tex&amp;gt; не всегда является минимальным остовным деревом.&lt;br /&gt;
|proof=Рассмотрим пример, где &amp;lt;tex&amp;gt;\mathrm{MBST}&amp;lt;/tex&amp;gt; не является минимальным остовным деревом:&lt;br /&gt;
&amp;lt;div class=&amp;quot;tleft&amp;quot; style=&amp;quot;clear:none&amp;quot;&amp;gt;[[Файл:MBST-example.png|left|thumb|700px|Пример MBST дерева.]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;tleft&amp;quot; style=&amp;quot;clear:none&amp;quot;&amp;gt;[[Файл:MSTisMBST.png|left|thumb|700px|Пример MST дерева.]]&amp;lt;/div&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Проверка остовного дерева на узкость ==&lt;br /&gt;
{{Задача&lt;br /&gt;
|definition=Проверить остовное дерево в графе на &amp;lt;tex&amp;gt;\mathrm{MBST}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
=== Алгоритм ===&lt;br /&gt;
Построим новый граф, добавим туда все рёбра меньше максимального из нашего остова. Если в результате у нас получится связный граф, значит мы сможем выделить из него остовное дерево с меньшим узким ребром &amp;lt;tex&amp;gt;-&amp;lt;/tex&amp;gt; наше дерево не самое узкое. Иначе, для связности графа нам необходимо добавить максимальные рёбра &amp;lt;tex&amp;gt;-&amp;lt;/tex&amp;gt; наше дерево является минимально узким. &lt;br /&gt;
Найдём максимальное ребро в нашем дереве. Добавим рёбра с весом меньше максимального при помощи [[СНМ (наивные реализации)|СНМ]], чтобы определить его связность. Если в результате у нас все вершины лежат в одном множестве, значит наше дерево не является &amp;lt;tex&amp;gt;\mathrm{MBST}&amp;lt;/tex&amp;gt;, иначе оно &amp;lt;tex&amp;gt;\mathrm{MBST}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
=== Асимптотика ===&lt;br /&gt;
По каждому ребру пройдём один раз, для поиска максимального, займёт &amp;lt;tex&amp;gt;O(N)&amp;lt;/tex&amp;gt;.&amp;lt;br&amp;gt;Работа с СНМ займет &amp;lt;tex&amp;gt;O(N\alpha(V))&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;\alpha&amp;lt;/tex&amp;gt; — обратная функция Аккермана, которая не превосходит &amp;lt;tex&amp;gt;4&amp;lt;/tex&amp;gt; во всех практических приложениях и которую можно принять за константу.&amp;lt;br&amp;gt;В результате получаем алгоритм работающий за линейное время &amp;lt;tex&amp;gt;O(N)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
=== Псевдокод ===&lt;br /&gt;
Все рёбра графа будем хранить в списке &amp;lt;tex&amp;gt;\mathtt{e}&amp;lt;/tex&amp;gt;, а рёбра остовного дерева в списке &amp;lt;tex&amp;gt;\mathtt{tree}&amp;lt;/tex&amp;gt;.&amp;lt;br&amp;gt;&lt;br /&gt;
В каждом ребре &amp;lt;tex&amp;gt;\mathtt{Edge}&amp;lt;/tex&amp;gt; храним следующую информацию:&lt;br /&gt;
* &amp;lt;tex&amp;gt;\mathtt{from}, \mathtt{to}&amp;lt;/tex&amp;gt; {{---}} соединяемые вершины&lt;br /&gt;
* &amp;lt;tex&amp;gt;\mathtt{cost}&amp;lt;/tex&amp;gt; {{---}} вес ребра&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
   '''bool''' ifMBST('''Edge'''[] e, '''Edge'''[] tree):&lt;br /&gt;
      '''int''' united = 0      &amp;lt;font color=green&amp;gt;// Сколько вершин мы объединили&amp;lt;/font&amp;gt; &lt;br /&gt;
      '''int''' maxEdge = -&amp;lt;tex&amp;gt;\infty&amp;lt;/tex&amp;gt;&lt;br /&gt;
      '''for''' i = 1 '''to''' tree.size&lt;br /&gt;
         maxEdge = max(maxEdge, tree[i].cost)      &amp;lt;font color=green&amp;gt;// Поиск максимального ребра в дереве&amp;lt;/font&amp;gt; &lt;br /&gt;
      '''for''' i = 1 '''to''' n&lt;br /&gt;
         '''if''' e[i].cost &amp;gt;= maxEdge                   &amp;lt;font color=green&amp;gt;// Не соединяем вершины, если ребро не меньше максимального&amp;lt;/font&amp;gt; &lt;br /&gt;
            '''continue'''&lt;br /&gt;
         '''if''' find(e[i].from]) != find(e[i].to)      &amp;lt;font color=green&amp;gt;// Объединяем вершины, если они в разных множествах&amp;lt;/font&amp;gt; &lt;br /&gt;
            united++&lt;br /&gt;
         unite(e[i].from,e[i].to)&lt;br /&gt;
      '''if''' united == e.size - 1                      &amp;lt;font color=green&amp;gt;// Дерево подходит, если в результате мы соединили все вершины&amp;lt;/font&amp;gt; &lt;br /&gt;
         '''return''' ''true''&lt;br /&gt;
      '''else''' &lt;br /&gt;
         '''return''' ''false''&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Cм. также==&lt;br /&gt;
*[[Алгоритм Краскала]]&lt;br /&gt;
*[[Остовные деревья: определения, лемма о безопасном ребре]]&lt;br /&gt;
*[[СНМ (наивные реализации)]]&lt;br /&gt;
&lt;br /&gt;
==Источники информации==&lt;br /&gt;
*[https://en.wikipedia.org/wiki/Minimum_bottleneck_spanning_tree Википедия — Minimum bottleneck spanning tree]&lt;br /&gt;
&lt;br /&gt;
[[Категория: Алгоритмы и структуры данных]] &lt;br /&gt;
[[Категория: Остовные деревья]]&lt;br /&gt;
[[Категория: Построение остовных деревьев]]&lt;/div&gt;</summary>
		<author><name>176.59.0.238</name></author>	</entry>

	</feed>