11. Взвешенный граф. Кратчайшие пути во взвешенном графе и алгоритм Форда постро-ения кратчайших маршрутов
Граф называется Взвешенным, если определена любая функция (функция на множестве ребер со значениями во множестве вещественных чисел). Сама функция называется в этой ситуации Весовой, а ее значение на том или ином ребре называется Весом этого ребра. Любой подграф данного графа и любой путь в данном графе Имеют свой вес: это - сумма весов ребер, входящих в этот подграф или в этот путь.
На взвешенном графе с весовой функцией можно ввести понятие Рассто-яния между вершинами. Делается это так.
Будем считать далее, если не будет специальных оговорок, что все рассматриваемые гра-фы связны. Вес любого пути будем называть Длиной этого пути. Ясно, что между двумя верши-нами существует такой путь, который имеет минимальную возможную длину. Эта длина и на-зывается Расстоянием между двумя вершинами. Путь, который эту длину реализует, естествен-но, называется Кратчайшим.
Существует классический Алгоритм Форда поиска кратчайших путей в графе. Основан он на следующем простом факте: Если имеется кратчайший путь между какими-либо двумя вершинами, то его часть между любыми двумя вершинами на нем же самом также является кратчайшим путем.
Алгоритм Форда позволяет найти кратчайшие пути из какой-либо одной вершины графа во все остальные. Эту исходную вершину можно выбрать произвольно, но, сделав выбор, далее уже исходить из того, что будут описаны кратчайшие пути именно из этой вершины во все остальные.
Опишем алгоритм по шагам.
Шаг 0. Занумеруем все вершины из , так что и при этом номер «1» имеет именно та вершина, из которой будут найдены кратчайшие пути во все остальные вершины. Построим, далее матрицу , положив
Шаг 1. Около первой строки матрицы , слева от матрицы, поставим числовую помет-ку «0» и такую же пометку проставим над первым столбцом матрицы. Затем просмотрим поме-ченную строку слева направо и всякий раз, встречая клетку с числом, прибавим это число к по-метке строки и сумму проставим над столбцом, в котором эта клетка находится.
Затем отразим пометки столбцов относительно главной диагонали. Возникнут помечен-ные строки. С каждой из помеченных строк проделаем то же самое: просмотрим помеченную строку слева направо и всякий раз, встречая клетку с числом, прибавим это число к пометке строки и сумму поставим в качестве пометки над столбком, в котором эта клетка стоит. При этом будем соблюдать принцип Ã: «имеющуюся пометку не менять».
Затем пометки столбцов отразим относительно главно диагонали и с помеченными стро-ками вновь проделаем то же самое. И так далее, пока не окажутся помеченными все строки и все столбцы.
Шаг 2. Просмотрим строки таблицы в порядке возрастания их номеров. В каждой строке просматриваются клетки слева направо и всякий раз, когда встречается число, оно складывает-ся с пометкой строки и сумма сравнивается с пометкой столбца, в котором найденное число расположено. Если сумма оказалась меньше, чем пометка столбца, то эта пометка столбца заме-няется на упомянутую сумму. Если же сумма оказалась больше или равной пометке, то ничего не меняется.
После такого просмотра всех строк новые пометки столбцов отражаются относительно главной диагонали и вся процедура повторяется. И так до тех пор пока не прекратятся какие бы то ни было изменения в пометках.
Шаг 3. Теперь по пометкам можно построить кратчайшие пути из первой вершины во все остальные. Фиксируем произвольную вершину и опишем кратчайший путь из первой вершины в вершину . Во-первых, длина этого кратчайшего пути равна помет-
Ке , стоящей над столбцом номер . Во-вторых, Предпоследняя Вершина в кратчайшем пути из первой вершины в вершину находится так: в столбце номер отыскиваем число, сумма которого с пометкой строки, в которой оно расположено, равна . Пусть номер строки, в ко-торой найденное число оказалось, равен . Тогда предпоследней вершиной в кратчайшем пути из 1 в будет вершина . (Разумеется, всё только что сказанное нуждается в доказательсвах,
Которые не приводятся.) Вершину, которая предшествует вершине , надо отыскивать как предпоследнюю в кратчайшем пути из 1 в и так далее.
Приведем пример. Пусть исходный взвешенный граф дает следующую матрицу :
10 |
13 | ||||||
10 |
11 | ||||||
13 |
17 |
10 | |||||
17 |
16 |
12 | |||||
10 |
11 |
15 | |||||
16 |
11 |
15 |
10 | ||||
11 |
12 |
15 | |||||
15 |
10 |
Начнем расставлять пометки:
0 |
10 |
13 |
30 |
23 |
46 |
21 |
38 | |
0 |
10 |
13 | ||||||
10 |
10 |
11 | ||||||
13 |
13 |
17 |
10 | |||||
30 |
17 |
16 |
12 | |||||
23 |
10 |
11 |
15 | |||||
46 |
16 |
11 |
15 |
10 | ||||
21 |
11 |
12 |
15 | |||||
38 |
15 |
10 |
Проведем уменьшение пометок:
0 |
10 |
13 |
30 |
23 |
34 |
21 |
38 | ||
0 |
10 |
13 |
30 |
23 |
46 |
21 |
38 | ||
0 |
0 |
10 |
13 | ||||||
10 |
10 |
10 |
11 | ||||||
13 |
13 |
13 |
17 |
10 | |||||
30 |
30 |
17 |
16 |
12 | |||||
23 |
23 |
10 |
11 |
15 | |||||
34 |
46 |
16 |
11 |
15 |
10 | ||||
21 |
21 |
11 |
12 |
15 | |||||
38 |
38 |
15 |
10 |
Укажем кратчайшие пути:
1Þ2: длина 10; путь (от конца к началу) 2Ü1;
1Þ3: длина 13; путь (от конца к началу) 3Ü1;
1Þ4: длина 30; путь (от конца к началу) 4Ü 3Ü1;
1Þ5: длина 23; путь (от конца к началу) 5Ü3Ü1;
1Þ6: длина 34; путь (от конца к началу) 6Ü7Ü2Ü1;
1Þ7: длина 21; путь (от конца к началу) 7Ü2Ü1;
1Þ8: длина 38; путь (от конца к началу) 8Ü5Ü3Ü1.
< Предыдущая | Следующая > |
---|