Опубликован: 21.08.2007 | Уровень: специалист | Доступ: платный | ВУЗ: Тверской государственный университет
Лекция 11:

Три алгоритма на графах

< Лекция 10 || Лекция 11: 1234
Аннотация: Построение минимального остова графа: алгоритм Крускала. Задача о лабиринте и поиск в глубину на неориентированном графе. Нахождение кратчайших путей из одного источника: алгоритм Дейкстры
Ключевые слова: граф, связность, остов (остовное дерево) графа, Связный граф, подграф, функция, стоимость, вес, минимальный остов, алгоритм, ПО, путь, ребро, цикла, дерево, связь, построение пути, выход, Неориентированный граф, списки смежности, список, массив, вершины графа, остовном лесом, объединение, компонента связности, вершина, длина пути, кратчайший путь, расстояние, глубинный остов (остовное дерево) графа, прямое ребро, множества, обратное ребро, Дополнение, поиск в глубину, компонент, мост графа, мост, минимум, вычисление, обход в глубину, представление, обход графа, ориентированное дерево, дерево кратчайших путей из вершины графа, длина, выделенная вершина, алгоритм Дейкстры, значение, константы, время выполнения, Эйлеров цикл, инцидентность, доказательство корректности, двудольный, параметр, произвольное, связная компонента неориентированного графа

Построение минимального остова

Во многих задачах в заданном графе нужно выделить некоторую часть, обладающую тем или иным свойством.

Определение 11.1. Граф G1=(V1,E1) называется подграфом графа G=(V,E), если V_{1}  \subseteq  V и E_{1} \subseteq  E.

Для неориентированных связных графов одним из интересных классов подграфов являются деревья, сохраняющие связность вершин. Они называются остовами, остовными деревьями, каркасами или скелетами графа.

Определение 11.2. Остовом (неориентированного) связного графа G=(V,E) называется его подграф S=(V,T), являющийся деревом.

Пусть задана функция c: E -> R, приписывающая каждому ребру e \in  E его стоимость (вес, длину) c(e) \in  R ( R - множество вещественных чисел). Тогда стоимость c(S) дерева S определяется как сумма стоимостей всех его ребер, т.е. c(S) = \sum_{ e \in T} c(e).

Минимальным остовом называется остов минимальной стоимости.

Таким образом, минимальный остов - это самая дешевая (короткая) система путей, связывающая все вершины G.

Опишем процедуру построения минимального остова, предложенную Дж. Крускалом в 1956г.

Алгоритм МинОстов

Вход: связный граф G=(V,E) и функция стоимости ребер c: E -> R.

Выход: минимальный остов S=(V,T).

Этап 1. Пусть E содержит m ребер. Упорядочим их по возрастанию стоимостей:

E= \{ e_1, e_2, \ldots, e_i, \ldots , e_m\} \text{ так, что } c(e_1) \leq c(e_2) \leq \ldots \leq c(e_i) \leq \ldots \leq c(e_m)

Этап 2. Последовательно для каждого i =1, ... , m определим множество ребер Ti:

\indent \indent\indent T_1 = \{e_1\};\\
\indent\indent\indent \ldots\\
T_{i} = \left\{
\begin{array}{ll}
T_{i-1} \cup \{e_i\}, &   \mbox{ если во множестве } T_{i-1} \cup \{e_i\} \mbox{ нет циклов}\\
 T_{i-1}, &  \mbox{ в противном случае} \\
\end{array}\right.
\indent\indent\indent \\

Положим T=Tm.

Выдать в качестве результата граф S=(V,T).

Докажем, что этот алгоритм корректен.

Теорема 11.1. Алгоритм МинОстов строит минимальный остов входного графа G=(V,E).

Доказательство Пусть результатом работы МинОстов на графе G=(V,E) является граф S=(V,T). Отметим вначале, что S является деревом. Действительно, отсутствие циклов следует из определения множеств Ti. Предположим, что S не является связным. Тогда должны существовать две вершины u, v \in  V, которые не достижимы друг из друга в S. Но граф G связен, поэтому в нем есть путь из u в v. Тогда на этом пути обязательно имеется такое ребро e_{i}=(a,b)\in  (E \setminus  T), у которого один конец a соединен путем с u в графе S, а второй конец b - нет. Но тогда на шаге i ребро ei должно попасть в Ti, так как его добавление не образует цикла. Следовательно, граф S связен.

Покажем теперь, что дерево S имеет минимальную стоимость. Пусть T={d1, ...,dk, ..., dn-1} - упорядочение всех ребер T по стоимости.

Покажем индукцией по k=1, ... , (n-1), что существует минимальный остов, включающий ребра d1, ...,dk.

Пусть S'=(V,T') - минимальный остов, у которого (k-1) наименьших по стоимости ребер совпадают с ребрами T, т.е. упорядочение всех его ребер имеет вид: T'={f1=d1, ..., fk-1= dk-1, fk, ..., fn-1} и f_{k} \ne  d_{k}. Пусть dk=(u,v). В T' имеется некоторый путь p из u в v, который не содержит ребро dk. На этом пути обязательно есть некоторое ребро f=(u''), не попавшее в T, иначе в T образовался бы цикл. Из построения T следует, что c(dk) <= c(f). Рассмотрим граф S''=(V, T'' \setminus  \{ f\} )\cup  \{ d_{k}\}. Очевидно, что этот граф является остовным деревом. Действительно, связь между u' и v' сохранилась, так как в S'' имеется путь: u' \leftrightarrow \dots  \leftrightarrow u \stackrel{d_k}{\leftrightarrow} v \leftrightarrow \dots  \leftrightarrow v'. Поэтому S'' - связный граф. Если бы в S'' был цикл, то он обязательно включал бы ребро dk. Но тогда часть этого цикла без ребра dk образовывала бы путь p' между u в v, не совпадающий с путем p. Следовательно, в дереве T' было бы два разных пути между u в v, что невозможно, так как тогда в T' был бы цикл. Отсюда заключаем, что в S'' циклов нет и S'' - остовное дерево. Его стоимость c(S'')= c(S') - c(f) + c(dk) <= c(S'). Так как S' - минимальный остов, то c(S'')=c(S') и S'' - тоже минимальный остов, у которого с S имеется k общих ребер: d1, ..., dk.

Тогда при k=n-1 получаем, что S - минимальный остов.

Пример 11.1. Рассмотрим нагруженный граф G, показанный на рис. 11.1.

Граф G

Рис. 11.1. Граф G

Применим к нему алгоритм МинОстов. На первом этапе упорядочим все ребра, а на втором - рядом с каждым из них определим соответствующее множество Ti. Ребра, попавшие в T, будем по ходу вычисления отмечать знаком '+', а не попавшие - знаком '-'.

\begin{array}{cccl}
\textbf{ E}       &\textbf{ c(e)} &\textbf{ входит } & T_i\\
(a,g) & 1 & +    & T_1 = \{ (a,g)\}  \\
(g,e) & 3  & +   &  T_2= \{ (a,g), (g,e)\}\\
(g,c) & 4  & +   &   T_3 =\{ (a,g), (g,e), (g,c)\}\\
(e,d)  & 4& +   &   T_4 =\{ (a,g), (g,e), (g,c), (e,d)\}\\
(a,b)  & 5 & +   &   T_5 =\{ (a,g), (g,e), (g,c), (e,d), (a,b)\}\\
\end{array}
\begin{array}{cccl}
\textbf{ E}       &\textbf{ c(e)} &\textbf{ входит } & T_i\\
(b,c)  &   6  & - & T_6=T_5\\
(d,g)) & 7 & - & T_7=T_6\\
(f,g) & 8  & +   &   T_8 =\{ (a,g), (g,e), (g,c), (e,d), (a,b), (f,g)\}\\
(e,f)  & 11 & - & T_9=T_8 \\
(c,d) & 12 & - & T_{10}=T_9\\
(a,f)  & 15& - & T_{11}=T_{10}
\end{array}

Таким образом, мы построили для G минимальный остов S=(V,T), где T=T8 ={ (a,g), (g,e), (g,c), (e,d), (a,b), (f,g)}. Он показан на рис. 11.2. Стоимость этого остова c(S)=25.

 Минимальный остов S=(V,T)  для графа G

Рис. 11.2. Минимальный остов S=(V,T) для графа G

Замечание. Так как дерево с n вершинами содержит в точности (n-1) ребер, то работу алгоритма МинОстов можно прекращать после такого шага i, на котором в Ti окажется |V| - 1 ребер. В нашем примере |V| =7 и алгоритм мог остановиться после 8-го шага.

< Лекция 10 || Лекция 11: 1234
Елена Алексеевская
Елена Алексеевская

Это в лекции 3.

Татьяна Дембелова
Татьяна Дембелова

Почему в вводной лекции курса Основы дискретной математики одним из свойств отношения частичного порядка упоминается антирефлексивность? Посмотрела в других источниках, там -0  рефлексивность... http://ru.wikipedia.org/wiki/%D0%9E%D1%82%D0%BD%D0%BE%D1%88%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BF%D0%BE%D1%80%D1%8F%D0%B4%D0%BA%D0%B0

Dima Soukhman
Dima Soukhman
Россия
Валерий Годжаев
Валерий Годжаев
Россия