<?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=ToxinG</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=ToxinG"/>
		<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/ToxinG"/>
		<updated>2026-04-13T01:57:20Z</updated>
		<subtitle>Вклад участника</subtitle>
		<generator>MediaWiki 1.30.0</generator>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9E%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_%D0%B2_%D0%BF%D0%BB%D0%B0%D0%BD%D0%B0%D1%80%D0%BD%D0%BE%D0%BC_%D0%B3%D1%80%D0%B0%D1%84%D0%B5&amp;diff=59444</id>
		<title>Остовное дерево в планарном графе</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9E%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_%D0%B2_%D0%BF%D0%BB%D0%B0%D0%BD%D0%B0%D1%80%D0%BD%D0%BE%D0%BC_%D0%B3%D1%80%D0%B0%D1%84%D0%B5&amp;diff=59444"/>
				<updated>2017-01-08T22:14:32Z</updated>
		
		<summary type="html">&lt;p&gt;ToxinG: Новая страница: «В  планарных графах возможно построить [[Остовные деревья: ...»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;В [[Укладка графа на плоскости | планарных графах]] возможно построить [[Остовные деревья: определения, лемма о безопасном ребре | остовное дерево]] за &amp;lt;tex&amp;gt;O(n)&amp;lt;/tex&amp;gt;, что заметно быстрее, чем алгоритмы, используемые для поиска остовного дерева в общем случае.&lt;br /&gt;
Рассмотрим более общую задачу {{---}} построение остовного дерева минимального (максимального) веса в планарном графе, которая также может быть решена за &amp;lt;tex&amp;gt;O(n)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
== Остовное дерево минимального (максимального) веса в планарном графе ==&lt;br /&gt;
Пусть есть граф &amp;lt;tex&amp;gt;G = (V, E)&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;V&amp;lt;/tex&amp;gt; – множество вершин, &amp;lt;tex&amp;gt;E&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; обозначим как &amp;lt;tex&amp;gt;\xi _G(v)&amp;lt;/tex&amp;gt; множество рёбер графа &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;, инцидентных &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt;. Для любого подмножества рёбер &amp;lt;tex&amp;gt;E'\subseteq E&amp;lt;/tex&amp;gt; граф &amp;lt;tex&amp;gt;(V, E')&amp;lt;/tex&amp;gt; будем называть остовным лесом графа &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;, когда граф ацикличен. Остовный лес является остовным деревом, когда он связен. Вес ребра &amp;lt;tex&amp;gt;e&amp;lt;/tex&amp;gt; обозначим как &amp;lt;tex&amp;gt;w(e)&amp;lt;/tex&amp;gt;. Вес подмножества рёбер &amp;lt;tex&amp;gt;F&amp;lt;/tex&amp;gt; обозначим как &amp;lt;tex&amp;gt;w(F)&amp;lt;/tex&amp;gt;, он является суммой весов рёбер, входящих в &amp;lt;tex&amp;gt;F&amp;lt;/tex&amp;gt;. Максимальный остовный лес &amp;lt;tex&amp;gt;F&amp;lt;/tex&amp;gt; называется остовным лесом минимального (максимального) веса, когда вес &amp;lt;tex&amp;gt;w(F)&amp;lt;/tex&amp;gt; минимален (максимален).&lt;br /&gt;
Для решения этой задачи, помимо исходного планарного графа &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;, потребуется его [[Двойственный граф планарного графа | двойственный граф]] &amp;lt;tex&amp;gt;G^* = (V^*, E)&amp;lt;/tex&amp;gt;, который можно легко построить геометрически по укладке &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; на плоскости&amp;lt;ref&amp;gt;E.L. Lawler, Combinatorial Optimization: Networks and Matroids (Holt, Rinehart and Winston, New York, 1976)&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Если данный граф связен, задача эквивалентна обычной задаче поиска минимального (максимального) по весу остовного дерева. Известно, что подмножество рёбер &amp;lt;tex&amp;gt;T\subseteq E&amp;lt;/tex&amp;gt; – максимальный остовный лес &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; тогда и только тогда, когда &amp;lt;tex&amp;gt;E\setminus T&amp;lt;/tex&amp;gt; – максимальный остовный лес &amp;lt;tex&amp;gt;G^*&amp;lt;/tex&amp;gt;. Таким образом, задача поиска минимального по весу остовного леса графа &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; – по сути то же самое, что задача поиска максимального по весу остовного леса &amp;lt;tex&amp;gt;G^*&amp;lt;/tex&amp;gt;.&lt;br /&gt;
== Формальное описание алгоритма ==&lt;br /&gt;
Итак, имеется планарный граф &amp;lt;tex&amp;gt;G = (V, E)&amp;lt;/tex&amp;gt;, его двойственный граф &amp;lt;tex&amp;gt;G^* = (V^*, E)&amp;lt;/tex&amp;gt; и веса рёбер &amp;lt;tex&amp;gt;w&amp;lt;/tex&amp;gt;, на выходе нужно получить остовный лес минимального веса &amp;lt;tex&amp;gt;T&amp;lt;/tex&amp;gt; графа &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; и остовный лес максимального веса &amp;lt;tex&amp;gt;T^*&amp;lt;/tex&amp;gt; графа &amp;lt;tex&amp;gt;G^*&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
'''Шаг 0''': Запись графов. &amp;lt;tex&amp;gt;T := \varnothing&amp;lt;/tex&amp;gt;; &amp;lt;tex&amp;gt;T^* := \varnothing&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
'''Шаг 1''': Если графы &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;G^*&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;
'''Шаг 2''': Выберем вершину &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt; в графе &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; или &amp;lt;tex&amp;gt;G^*&amp;lt;/tex&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
Если &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt; – изолированная вершина, удалим её и вернёмся к шагу 1;	&lt;br /&gt;
&lt;br /&gt;
Если &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt; – вершина &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; и в &amp;lt;tex&amp;gt;\xi _G(v)&amp;lt;/tex&amp;gt; есть петля, перейдём к шагу 3;&lt;br /&gt;
&lt;br /&gt;
Если v – вершина &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; и в &amp;lt;tex&amp;gt;\xi _G(v)&amp;lt;/tex&amp;gt; нет петель, перейдём к шагу 4;&lt;br /&gt;
&lt;br /&gt;
Если &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt; – вершина &amp;lt;tex&amp;gt;G^*&amp;lt;/tex&amp;gt; и в &amp;lt;tex&amp;gt;\xi _{G^*}(v)&amp;lt;/tex&amp;gt; есть петля, перейдём к шагу 5;&lt;br /&gt;
&lt;br /&gt;
Если &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt; – вершина &amp;lt;tex&amp;gt;G^*&amp;lt;/tex&amp;gt; и в &amp;lt;tex&amp;gt;\xi _{G^*}(v)&amp;lt;/tex&amp;gt; нет петель, перейдём к шагу 6;&lt;br /&gt;
&lt;br /&gt;
'''Шаг 3''': Пусть &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt; – петля &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;, инцидентная &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt;.&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;tex&amp;gt;G := G\setminus f&amp;lt;/tex&amp;gt;; &amp;lt;tex&amp;gt;G* := G*\setminus f&amp;lt;/tex&amp;gt;; &amp;lt;tex&amp;gt;T* := T*\cup \{f\}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
 &lt;br /&gt;
Вернёмся к шагу 1.&lt;br /&gt;
&lt;br /&gt;
'''Шаг 4''': Найдём ребро &amp;lt;tex&amp;gt;e&amp;lt;/tex&amp;gt;, достигающее минимального веса &amp;lt;tex&amp;gt;w(e)&amp;lt;/tex&amp;gt; среди рёбер из &amp;lt;tex&amp;gt;\xi _G(v)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;G := G/e&amp;lt;/tex&amp;gt;; &amp;lt;tex&amp;gt;G^* := G^*\setminus e&amp;lt;/tex&amp;gt;; &amp;lt;tex&amp;gt;T := T\cup \{e\}&amp;lt;/tex&amp;gt;. (&amp;lt;tex&amp;gt;/&amp;lt;/tex&amp;gt; обозначает операцию стягивания ребра)&lt;br /&gt;
&lt;br /&gt;
Вернёмся к шагу 1.&lt;br /&gt;
&lt;br /&gt;
'''Шаг 5''': Пусть &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt; – петля &amp;lt;tex&amp;gt;G^*&amp;lt;/tex&amp;gt;, инцидентная &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt;.&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;tex&amp;gt;G := G\setminus f&amp;lt;/tex&amp;gt;; &amp;lt;tex&amp;gt;G^* := G^*\setminus f&amp;lt;/tex&amp;gt;; &amp;lt;tex&amp;gt;T := T\cup\{f\}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
 &lt;br /&gt;
Вернёмся к шагу 1.&lt;br /&gt;
&lt;br /&gt;
'''Шаг 6''': Найдём ребро &amp;lt;tex&amp;gt;e&amp;lt;/tex&amp;gt;, достигающее максимального веса &amp;lt;tex&amp;gt;w(e)&amp;lt;/tex&amp;gt; среди рёбер из &amp;lt;tex&amp;gt;\xi _{G^*}(v)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;G\setminus e&amp;lt;/tex&amp;gt;; &amp;lt;tex&amp;gt;G^*/e&amp;lt;/tex&amp;gt;; &amp;lt;tex&amp;gt;T^*:= T^*\cup\{e\}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Вернёмся к шагу 1.&lt;br /&gt;
== Корректность и время работы ==&lt;br /&gt;
Легко убедиться в том, что на протяжении всех итераций приведённого алгоритма &amp;lt;tex&amp;gt;G^*&amp;lt;/tex&amp;gt; является двойственным графом графа &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;, из чего следует корректность этого алгоритма.&lt;br /&gt;
&lt;br /&gt;
На каждой итерации алгоритма происходит удаление ребра или вершины, из этого следует, что количество итераций алгоритма не превосходит &amp;lt;tex&amp;gt;|V| + |V^*| + |E| = O(n)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Далее опишем, как добиться того, чтобы каждая итерация осуществлялась за &amp;lt;tex&amp;gt;O(1)&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; обозначим &amp;lt;tex&amp;gt;d_G(v)&amp;lt;/tex&amp;gt; степень этой вершины (петли считаются дважды). Из формулы Эйлера следует, что в &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; или &amp;lt;tex&amp;gt;G^*&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; – планарный граф, а &amp;lt;tex&amp;gt;G^*&amp;lt;/tex&amp;gt; - двойственный к нему, существует вершина, степень которой меньше четырёх.&lt;br /&gt;
&lt;br /&gt;
На шаге 2 будем выбирать именно такую вершину. Сначала покажем, что каждая интеграция алгоритма выполняется за &amp;lt;tex&amp;gt;O(n)&amp;lt;/tex&amp;gt;, предполагая, что нужная вершина на шаге 2 всегда выбирается за константное время, реализацию обсудим позже.&lt;br /&gt;
&lt;br /&gt;
Итак, оба графа хранятся в виде списков смежности. Тогда, очевидно, шаги 1 и 2 выполняются за &amp;lt;tex&amp;gt;O(1)&amp;lt;/tex&amp;gt;. Поскольку при такой реализации рёбра удаляются за константное время, шаги 3 и 5 выполняются за &amp;lt;tex&amp;gt;O(1)&amp;lt;/tex&amp;gt;. Рассмотрим шаг 4. Поскольку степень вершины не больше четырёх, поиск ребра минимального веса займёт константное время. Стягивание ребра &amp;lt;tex&amp;gt;e = (u, v)&amp;lt;/tex&amp;gt; происходит за &amp;lt;tex&amp;gt;O(\min\{d_G(v), d_G(u)\}) = O(3) = O(1)&amp;lt;/tex&amp;gt;. Для шага 6 рассуждения аналогичны.&lt;br /&gt;
&lt;br /&gt;
Вернёмся к выбору вершины на шаге 2. Для этого создадим хэш-таблицу, содержащую все вершины степени меньше четырёх. Это позволяет выбрать нужную вершину за &amp;lt;tex&amp;gt;O(1)&amp;lt;/tex&amp;gt;, но хэш-таблицу также нужно обновлять. При удалении ребра из графа степени вершин, инцидентных ему, уменьшаются на 1 (или на 2 в случае петли), степени же остальных вершин не меняются. Теперь рассмотрим случай стягивания ребра. Удаляются концы стягиваемого ребра, а получающаяся в результате этого вершина должна быть добавлена в хэш-таблицу, если её степень меньше четырёх. Таким образом, на каждой итерации алгоритма из хэш-таблицы может быть удалено максимум две вершины, а добавлено - максимум четыре, значит, хэш-таблица обновляется за константное время.&lt;br /&gt;
Создание хэш-таблицы должно происходить вместе с шагом 0 и осуществляется за &amp;lt;tex&amp;gt;O(|V| + |V^*| + |E|)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
== Примечания ==&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
== Источники информации ==&lt;br /&gt;
[http://www.sciencedirect.com/science/article/pii/0166218X9400095U Sciencedirect {{---}} The minimum spanning tree problem on a planar graph]&lt;/div&gt;</summary>
		<author><name>ToxinG</name></author>	</entry>

	</feed>