- •Глава I Основные понятия
- •§1. Введение
- •§2. Алгоритмы и их сложности
- •§3. Запись алгоритмов
- •Глава II Графы и сети
- •§1. Графы, сети
- •§2. Машинное представление графов и сетей.
- •Глава III Сортировка данных
- •§1. Сложность задачи сортировки
- •§2. Алгоритм сортдерево
- •Глава IV Поиск в графе
- •§1. Поиск в глубину.
- •§2. Поиск в ширину.
- •§3. Цепи и пути в графах.
- •§4. Пути в лабиринте.
- •Глава V Задача о минимальном остове
- •Глава VI Пути в сетях
- •§1 Общий случай. Алгоритм Форда-Беллмана.
- •§2 Случай неотрицательных весов. Алгоритм Дейкстры.
- •§3. Случай бесконтурной сети.
- •§4. Задача о максимальном пути и сетевые графики.
- •§3. Задача о maxmin пути.
- •§6. Задача о кратчайших путях между всеми парами узлов.
§3. Цепи и пути в графах.
В этом разделе будем рассматривать только связные неориентированные графы. Нетрудно проверить, что и ПВГ-дерево, и ПВШ-дерево действительно являются деревьями, и более того — корневыми деревьями (см. гл.2), причем корнями этих деревьев являются те вершины, с которых начинался поиск (собственно поэтому они и в ПВГ и в ПВШ названы корневыми вершинами).
Ранее, в главе 2, мы условились считать, что если в ориентированном графе имеется дуга (v,w), то v — отец w, a w — сын v. Легко видеть, что даваемые алгоритмами 4.1 и 4.2 значения переменных ОТЕЦ[w] согласуются с ранее введенным понятием, а именно, если v=ОТЕЦ[w], то (v,w)E.
Напомним, что вершина v называется предком вершины w. и, соответственно, w — потомком v, если в корневом дереве существует путь от v до w. Например, в корневом дереве ПВШ(1) из рис.4.2 вершина 8 является потомком вершины 2. В следующей теореме формулируются полезные свойства ПВГ-деревьев.
Теорема 4.3. Пусть Т — ПВГ-дерево связного неориентированного графа G=(V,E), и пусть {u,w}E. Тогда либо u — потомок w, либо w потомок u в корневом дереве Т.
Предположим без ограничения общности, что вершина и будет просмотрена раньше, чем w. Рассмотрим процесс поиска в глубину, начиная с первого вызова процедуры ПВГ(u) (см. алгоритм 4.1.), и до первого вызова ПВГ(w). Это означает, что мы прошли по некоторым ребрам из вершины u в w. Но именно эти пройденные ребра мы и относим в ПВГ-дерево Т. Они образуют путь из u в w, следовательно, вершина u является предком вершины w в корневом дереве Т.
Понятно, что ПВШ-дерево не обладает свойством, сформулированным в теореме 4.3. Например, в ПВШ(1)-дереве, изображенном на рис.4.2, ни вершина 3 не является потомком вершины 6, ни вершина 6 не является потомком вершины 3 (говорят, что такие вершины несравнимы в корневом дереве).
Как в ПВГ-дереве, так и в ПВШ-дереве для каждой вершины w, существует единственный путь из корня v в w. Как построить этот путь? Это несложно делается с помощью массива ОТЕЦ. Отметим только, что под путем в орграфе мы договорились понимать в зависимости от степени удобства, либо последовательность ребер, либо последовательность вершин (см.гл.2). В предлагаемом ниже алгоритме 4.3 требуемый путь идентифицируется последовательностью вершин. Предполагается, что перед работой этого алгоритма работала либо процедура ПВГ(v), либо процедура ПВШ(v).
АЛГОРИТМ 4.3. ПОСТРОЕНИЕ ПУТИ
Данные: корневая вершина поиска v, вершина w. массив ОТЕЦ.
Р
begin
СТЕК:=Ø;
СТЕК
w;
u:=w;
while
u≠v do
begin
u:=ОТЕЦ[u];
CTEKu;
end;
end.
Понятно, что последовательность вершин v=v0,v1,...,vk=w, полученная считыванием СТЕКА, образует как v-w-путь в корневом дереве Т (или D), так и v-w-цепь в исходном графе G.
Оказывается, что пути, построенные поиском в ширину, обладают очень полезным свойством, а именно, справедлива.
Теорема 4.4. Пусть D — ПВШ-дерево с корнем v связного неориентированного графа G=(V,E). Тогда для любой вершины wV единственный v-w-путь в D определяет кратчайшую по числу ребер цепь среди всех v-w-цепей в графе G.
Пусть кратчайшая по числу ребер v-w-цепь в графе G содержит t ребер. (Будем говорить, что вершина w находится на расстоянии t от v). Докажем теорему индукцией по расстоянию t.
Пусть t=l. Тогда всякая вершина u, находящаяся на расстоянии 1 от v, будет просмотрена из v, то есть для всех таких вершин u справедливо равенство ОТЕЦ[u]=v. Одновременно v — единственная вершина связного графа, для которой OTEЦ,[v]=nil. Значит, как это следует из алгоритма 4.3, поиск в ширину правильно определяет кратчайшие цепи до всех вершин, находящихся на расстоянии 1 от вершины v.
Пусть ПВШ-дерево правильно определяет кратчайшие цепи до всех вершин, находящихся на расстоянии t ≤ k от v.
Пусть вершина w находится на расстоянии k+1 от v и путь v=v0,v1...,vk+1=w — кратчайшая v-w-цепь в графе G. Ясно, что цепь v=v0,v1,...,vs является кратчайшей v-vs-цепью в графе G для всех s=l,...,k. В частности, вершина vk находится на расстоянии k от v.
Рассмотрим ПВШ(v)-дерево в тот момент, когда просматривается вершина w, и пусть u=OTEЦ[w]. В силу предположения индукции достаточно доказать, что и находится на расстоянии k от v. Если u=vk то теорема доказана. Пусть u≠vk. Так как ребро {vk,w}E, и вершина w просмотрена из вершины u, то это означает, что вершина и просмотрена раньше чем vk. Следовательно, расстояние от v до и не больше, чем расстояние от v до vk, и, значит, вершина и находится на расстоянии не больше k от v. По предположению индукции алгоритм правильно определит кратчайшую цепь до u, и, следовательно, до w.
Заметим, что пути, определяемые поиском в глубину, вообще говоря, не являются кратчайшими. Например, на рис.4.1 путь от вершины 1 до вершины 8 проходит через вершины 2,3,4,7,6 и имеет длину 6, а поиск в ширину (см.рис.4.2) определяет путь, проходящий через вершины 4,7, длиной 3.