- •Литература
- •3. Алгоритмы на графах
- •3.1. Общие положения
- •3.2. Алгоритмы нахождения оптимального пути
- •Волновой алгоритм построения кратчайшего пути для взвешенного графа.
- •3.7. Задачи для самостоятельной работы
- •3.6. Алгоритм кратчайшей раскраски графа
- •3.3. Нахождение компонент связности
- •3.5.1. Алгоритм построения произвольного остова
- •3.5. Дерево. Остов
3.2. Алгоритмы нахождения оптимального пути
Путь из начальной вершины к конечной вершине- последовательность дуг, начинающаяся в вершине, заканчивающаяся в вершине, и такая, что конец очередной дуги является началом следующей:
.
Элементарный путь – путь, в котором вершины не повторяются.
Простой путь – путь, в котором дуги не повторяются.
Маршрут - последовательность рёбер, составляющих, как и путь, цепочку.
Длина пути взвешенного графа определяется как сумма весов его дуг. Если граф не взвешен, то можно считать веса всех дуг равными 1.
Кратчайшим путем между выделенной парой вершин и называется путь, имеющий наименьшую длину среди всех возможных путей между этими вершинами.
При построении длиннейшего пути рассматриваются элементарные или простые длиннейшие пути, длиннейшие пути с заданным числом выполненных циклов. Длиннейший путь между и - путь, имеющий наибольшую длину среди всех возможных путей между этими вершинами.
Волновой алгоритм построения кратчайшего пути для взвешенного графа.
1. Вершина получает вес, её номер вводится в массивМ номеров вершин, изменивших вес. Остальные вершины получают веси их номера не попадают в массив M.
3
2. Если массив М пуст, то выполняется п.3, иначе выбирается с исключением из него очередная вершина xi и пересчитываются веса вершин, принадлежащих исходу E(xi) вершины xi:
xi Vj =min(Vj, Vi+ lij)). Если вес Vi уменьшается, то номер j включается с приведением подобных в М. Снова выполняется пункт 2.
3. Если вес Vk =, то делается вывод, что пути из вершины xн к вершине xк нет, иначе выполняется процедура выделения дуг, такая же, как в волновом алгоритме для невзвешенного графа, за исключением того, что разность весов вершин xj и xi должна быть равна , т. е. Vi--Vj=lij.
4. После выделения дуг строятся кратчайшие пути, длины которых равны .
Обратите внимание на то, что алгоритм выполняется в 3 прохода. На 1-ом проходе (это п.2 словесного описания алгоритма – СОА) вычисляются и пересчитываются в зависимости от прохождения волны, исходящей от рассматриваемой вершины и доходящей до смежных с ней вершин, веса всех вершин, включая конечную (xкон=x6). На 2-м проходе (это п.3 СОА) выявляютя «претенденты» на кратчайший путь, т.е. дуги, которые могут составить этот путь (эти пути, поскольку их может оказаться несколько с одинаковым весом). На 3-м проходе из дуг-претендентов составляются конкретные кратчайшие пути.
На с.6 приведена таблица процесса решения для 1-го прохода алгоритма.
В п.3 СОА имеется ссылка на волновой алгоритм для невзвешенного графа (можно считать, что для такого графа веса всех дуг одинаковы и равны 1), с учётом которого процедура выделения дуг–претендентов формируется так.
Выделяем текущую вершину xi, начиная с конечной, и записываем множество всех вершин, смежных с текущей: G-1(xi)={xj,xm…}; здесь номера вершин упорядочены по возрастанию. Затем последовательно для каждой вершины из множества G-1(xi) определяем вес дуги как разность весов вершин, текущей xi и рассматриваемой xj. Если vi-vj=lij, где lij- вес дуги, а vi, vj – веса вершин, вычисленные на первом проходе (окончательные значения!), то эта дуга является фрагментом одного из кратчайших путей. Далее xj полагаем текущей вершиной и переходим на начало этой процедуры. Процедура заканчивается при достижении начальной вершины.
4
Несмежные вершины отмечены в таблице единицами. Далее решается задача построения одного кратчайшего покрытия (методом минимального столбца - максимальной строки). Вершины, принадлежащие каждому подмножеству, вошедшему в найденное кратчайшее покрытие, окрашивается одной краской. Если некоторая вершина принадлежит нескольким вошедшим в покрытие подмножествам, то она в одном остаётся, из остальных исключается. Для нашего примера получим два подмножества: Y1,Y2,Y3, определяющие три краски 0,1,2 соответственно. как показано на рис. 3.13, если x1 покрасить краской 0, то все смежные с ней вершины x2, x3, x4, x5 нельзя покрасить 0; x2, x4 - смежные, для них необходимы две разные краски (1 и 2), x3, x4 - аналогично. Таким образом, изображенная на примере раскраска - минимальна.