- •3. Алгоритмы на графах
- •3.1. Общие положения
- •3.2. Алгоритмы нахождения оптимального пути
- •3.3. Алгоритм нахождения компонент связанности
- •3.2.1. Алгоритм построения компонент связности в неориентированном графе
- •3.4. Дерево. Остов.
- •3.4.1. Алгоритм построения произвольного остова
- •3.4.2. Алгоритм построения минимального остова
- •3.6. Алгоритм кратчайшей раскраски графа
- •3.3. Алгоритмы нахождения подграфов
- •3.3.2. Алгоритм построения системы независимых циклов графа
3.2. Алгоритмы нахождения оптимального пути
Путь из начальной вершины хн к кончиной вершине хк - последовательность дуг, начинающаяся в вершине хн Х, заканчивающаяся в вершине хк Х, и такая, что конец очередной дуги является началом следующей: (хн, хi1)( хi1, хi2)( хi2… хik)( хik, xk) = (xн, хк).
Элементарный путь – путь, в котором вершины не повторяются.
Простой путь - путь, в котором дуги не повторяются.
Маршрут - последовательность ребер, составляющих, как и путь, цепочку.
Длина пути взвешенного графа определяется как сумма весов - его дуг. Если граф не взвешен, то можно считать веса дуг равными 1 .
Кратчайшим путем между выделенной парой вершин хн и хк называется путь, имеющий наименьшую длину среди всех возможных путей между этими вершинами.
При построении длиннейшего пути рассматриваются элементарные или простые длиннейшие пути, длиннейшие пути с заданным числом выполненных циклов. Длиннейший путь между хн и хк - путь, имеющий наибольшую длину среди всех возможных путей между этими вершинами.
Волновой алгоритм построения кратчайшего пути для невзвешенного графа
-
Вершина Xн помечается 0, остальные вершины считаются непомеченными.
-
i=i+1. Помечаются индексом i все непомеченные ранее вершины, в которых есть дуги от помеченных вершин. Если помечена вершина Хк, то выполняется п.2. Иначе, если в текущем значении индекса i оказались помеченными какие-либо вершины, то выполняется п.1. Иначе делается вывод, что пути из вершины Хн в Хк нет.
-
Обратным проходом по дугам начиная от вершины Хк выделяются те дуги, которые инцидентны выделенным вершинам и разность между весами которых равна 1.
-
При движении от вершины Хн по выделенным дугам оказывается построены все кратчайшие пути к вершине Хк.
Волновой алгоритм построения кратчайшего пути для взвешенного графа
1. Вершина Хн получает вес V = 0, ее номер вводится в массив М номеров вершин, изменивших вес. Остальные вершины Xi получают вес Vi = ∞, их номера не попадают в массив М.
2. Если массив M пуст, то выполняется п. 3, иначе выбирается с исключением из него очередная вершина Xi, и пересчитываются веса вершин, принадлежащих исходу G(Xi) вершины Xi: Xi G (Xi)(Vj = min (Vj Vi + lij)). Если вес Vj уменьшается, то номер j включается в М. Снова выполняется п. 2.
3. Если вес Vi = ∞, то делается вывод, что пути из вершины Хн к вершине Xk нет, иначе выполняется процедура выделения дуг, такая же, как в волновом алгоритме для невзвешенного графа, за исключением того, что разность весов вершин Xi и Xj должна быть равна lij.
4
.
После выделения дуг строятся кратчайшие
пути, длины которых равны Vk.
Пример
1. Vi = V1 = 0, V2 = V3 = V4 = V3 = V6 = ∞, M = {1}
2. M ≠ 0, i = 1, M = 0, G(X1) = {X2, X3}; V2 = min (∞, 0 + 1)=1; M ={2}
Vi = min (∞, 0 + 4) = 4; M ={2,3};
2. M ≠ 0, i = 2, M = {3}, G(X2) = {X3, X4}; V3 = min (4, 1 + 2)=3; M = {3}; V4 = min (∞, 1 + 5) = 6; M={3,4};
2. M ≠ 0, i = 3, M = {4}, G(X3) = {X4, X5}; V4 = min (6, 3 + 2)=5; M = {4}; V5 = min (∞, 3 + 4) = 7; M={4,5};
2. M ≠ 0, i = 4, M = {5}, G(X4) = {X5, X6}; V5 = min (7, 5 + 1)=6; M = {5}; V6 = min (∞, 5 + 4) = 9; M={5,6};
2. M ≠ 0, i = 5, M = {6}, G(X6) = {X6}; V6 = min (9, 6 + 2)=8; M = {6};
2. M ≠ 0, i = 6, M = {0}, G(6) = {0};
3. G-1(X6) = {X4, X5}; Vx6 - Vx5 = 2; l6 = 2,* Vx6 - Vx4 = 3, l4,6 = 4.
G-1(X5) = {X3, X4}; Vx5 - Vx4 = 1; l4,5 = 1,* Vx5 - Vx3 = 3, l5,3 = 4.
G-1(X4) = {X2, X3}; Vx4 - Vx3 = 2; l3,4 = 2,* Vx4 - Vx2 = 4, l2,4 = 5.
G-1(X3) = {X1, X2}; Vx3 - Vx2 = 2; l2,3 = 2,* Vx3 - Vx1 = 3, l1,3 = 4.
G-1(X2) = {X1}; Vx2 - Vx1 = 1; l1 = 1,*
Построен кратчайший путь (Xн, Xк) длиной 8:
(Xн = Х1, Х2)( Х2, Х3)( Х3, Х4)( Х4, Х5)( Х5, Х6 = Хк).
Процесс решения можно оформить в виде таблицы:
-
Х1
Х2
Х3
Х4
Х5
Х6
М
0
∞
∞
∞
∞
∞
1
0
1
4
∞
∞
∞
2,3
0
1
3
6
∞
∞
3,4
0
1
3
5
7
∞
4,5
0
1
3
5
6
9
5,6
0
1
3
5
6
8
6
0
1
3
5
6
8
0
В
олновой
алгоритм построения длиннейшего пути
во взвешенном графе
Используется волновой алгоритм построения кратчайшего пути для взвешенного графа со следующим отличием:
1. В первом пункте волнового алгоритма нужно присвоить всем вершинам вес 0, тогда автоматически будут строиться длиннейшие пути.
2. Во втором пункте алгоритма Vj = max (Vj, Vi + lij)
-
Х1
Х2
Х3
Х4
Х5
Х6
М
0
0
0
0
0
0
1
0
1
4
0
0
0
2,3
0
1
4
6
0
0
3,4
0
1
4
6
8
0
4,5
0
1
4
6
8
10
5,6
0
1
4
6
8
10
6
0
1
4
6
8
10
0
Vx6
- Vx5 =
l5,6
= 2(*(X5,
X6))
Vx6
- Vx4 =
l4,6
= 4(*(X4,
X6))
Vx4
- Vx3 =
l3,4
= 2(*(X3,
X4))
Vx4
- Vx2 =
l2,4
= 5(*(X2,
X4))
Vx2
- Vx1 =
l1,2
= 1(*(X1,
X2))
Vx3
- Vx1 =
l1,3
= 4(*(X1,
X3))
Обратный ход:
Построены три длиннейшие пути:
1. (Х1, Х2)( Х2, Х4)( Х4, Х6)
2. (Х1, Х3)( Х3, Х4)( Х4, Х6)
3. (Х1, Х3)( Х3, Х5)( Х5, Х6)
