Определить кратчайшие пути между всеми парами вершин графов с использованием алгоритма Флойда
а б
в г
Рис. 20
Рассмотрим граф G=(X,U), называемый в дальнейшем сетью. Пусть каждой дуге (xi, xj) сопоставлено положительное число cij , называемое пропускной способностью дуги. В сети выделяют два специальных узла, один из них называют источником (обозначим его через s), другой – стоком (обозначим его через t). Множество неотрицательных чисел fij , определенных на дугах (xi,xj), называют потоками в дугах, если выполняются следующие условия:
Линейные ограничения отражают тот факт, что поток, втекающий в вершину, равен потоку, вытекающему из нее, за исключением вершин, являющихся источником и стоком. При этом поток в каждой дуге не должен превышать ее пропускной способности. Величина v, равная сумме потоков по всем дугам, исходящим из источника s, или сумме потоков по всем дугам, заходящим в вершину t, называется величиной потока в сети:
Задача о максимальном потоке состоит в нахождении такого множества потоков по дугам, чтобы величина потокаv в сети была максимальной при условии отсутствия превышения пропускных способностей дуг.
Для определения максимального потока в сети можно воспользоваться алгоритмом Форда-Фалкерсона. Идея алгоритма состоит в следующем. Выбирается некоторый начальный поток из s в t и осуществляется поиск увеличивающего пути. Если увеличивающий путь найти не удаётся, выполнение алгоритма заканчивается, и текущий поток из s в t является максимальным. Если увеличивающий путь найден, то поток вдоль данного пути увеличивается до максимально возможного значения. Затем выполняется поиск нового увеличивающего пути, и т.д.
Вершина может находиться в одном из трёх состояний: вершине приписана пометка и вершина просмотрена (т.е. она имеет пометку и все смежные с ней вершины «обработаны»); пометка приписана, но вершина не просмотрена (т.е. она имеет пометку, но не все смежные с ней вершины обработаны); вершина не имеет пометки. Пометка произвольной вершины xi состоит из двух частей и имеет один из двух видов: (+xj, ) или (xj, ). Часть +xj пометки первого типа означает, что поток допускает увеличение вдоль дуги (xj, xi). Часть xj пометки другого типа означает, что поток может быть уменьшен вдоль дуги (xi, xj). В обоих случаях задаёт максимальную величину дополнительного потока, который может протекать от s к xi.
Шаг 1. Присвоить вершине s пометку (+s, (s) = ∞). Вершине s присвоена пометка и она просмотрена, все остальные вершины без пометок.
Шаг 2. Взять некоторую непросмотренную вершину с пометкой; пусть её пометка будет (xk, (xi)).
(I) Каждой непомеченной вершине xj Г (xi), для которой fij < cij, присвоить пометку (+xi, (xj)), где (xj) = min [(xi), cij fij ].
(II) Каждой непомеченной вершине xj Г-1(xi), для которой fji > 0, присвоить пометку (xi, (xj)), где (xj) = min [(xi), fji ]. Теперь вершина xi и помечена, и просмотрена, а вершины xj, пометки которым присвоены в (I) и (II), являются непросмотренными.) Обозначить каким-либо способом, что вершина xi просмотрена.
Шаг 3. Повторять шаг 2 до тех пор, пока либо вершина t будет помечена , и тогда перейти к шагу 4, либо t будет не помечена и никаких других пометок нельзя будет расставить; в этом случае алгоритм заканчивает работу с максимальной величиной потока.
Б. Увеличение потока
Шаг 4. Положить x = t и перейти к шагу 5.
Шаг 5. (I) Если пометка в вершине x имеет вид (+z, (x)), то изменить поток вдоль дуги (z, x) с f(z, x) на f(z, x) + (t).
(II) Если пометка в вершине x имеет вид (z, (x)), то изменить поток вдоль дуги (x, z) с f(x, z) на f(x, z) (t).
Шаг 6. Если z = s, то стереть все пометки и вернуться к шагу 1, чтобы вновь начать расставлять пометки, но используя уже улучшенный поток, найденный на шаге 5. Если z s, то положить x = z и вернуться к шагу 5.
7.2. Пример. Найти максимальный поток от x1 к x9 для графа
Рис. 21
Решение. В качестве начального возьмем поток с нулевыми значениями на всех дугах. Алгоритм работает следующим образом.
Шаг 1. Припишем вершине x1 пометку (+x1, ∞).
Шаг 2. (I) Множество вершин { xj | xj Г (x1), f1j < c1j , xj не помечена} есть {x2, x4}, вершине x2 приписывается пометка (+x1, min [∞, 14 - 0]), т.е. (+x1, 14), вершине x4 приписывается (+x1, min [∞, 23 - 0]), т.е. (+x1, 23).
(II) Множество вершин { xj | xj Г-1 (x1), fj1 > 0, xj непомечена} является пустым. Итак, x1 помечена и просмотрена, x2 и x4 помечены и не просмотрены, а все остальные вершины не помечены. Повторяем шаг 2 и первой просматриваем вершину x2.
(I) Множество { xj | xj Г (x2), f2j < c2j , xj не помечена} есть x3, и для x3 пометкой будет (+x2, min [14, 10 - 0]) = (+x2, 10).
(II) Множество вершин { xj | xj Г-1 (x2), fj2 > 0, xj не помечена} является пустым. Теперь вершины x1 и x2 помечены и просмотрены, а x3 и x4 помечены, но не просмотрены.
Беря для просмотра x3 и повторяя шаг 2, придем к следующим пометкам:
для x5 пометкой будет (+x3, min [10, 12 - 0]) = (+x3, 10),
для x8 пометкой будет (+x3, min [10, 18 - 0]) = (+x3, 18).
Выбирая для просмотра x4, найдем, что никаких пометок расставить нельзя.
Продолжая просмотр с x5, получим следующие пометки:
пометка для x6 будет (+x5, min [10, 25 - 0]) = (+x5, 10),
пометка для x7 будет (+x5, min [10, 4 - 0]) = (+x5, 4),
пометка для x9 будет (+x7, min [4, 15 - 0]) = (+x7, 4).
Переходя к шагам 4 и 5, получим:
x = x9; f7, 9 = 0 + 4 = 4;
x = x7; f5, 7 = 4;
x = x5; f3, 5 = 4;
x = x3; f2, 3 = 4;
x = x2; f1, 2 = 4.
Вид потока в конце шага 5 и пометки вершин до их стирания на шаге 6 показаны на рис. 22. Все потоки показаны подчеркиванием. Толстыми линиями далее везде обозначены насыщенные дуги, т.е. дуги, в которых величина потока равна их пропускной способности.
Стирая пометки у вершин и возвращаясь к шагу 1 для второй итерации, получим следующие новые пометки вершин (помеченные, но не просмотренные вершины просматриваются в порядке возрастания их номеров):
Шаг 3.
Пометкой для x1 будет (+x1, ∞),
пометкой для x2 будет (+x1, min [∞, 14 - 4]) = (+x1, 10),
пометкой для x4 будет (+x1, min [∞, 23 - 0] = (+x1, 23);
теперь вершина x1 помечена и просмотрена.
Пометкой для x3 будет (+x2, min [10, 10 - 4]) = (+x2, 6),
теперь вершина x2 помечена и просмотрена.
Пометкой для x5 будет (+x3, min [6, 12 - 4]) = (+x3, 6),
Пометкой для x8 будет (+x3, min [6, 18 - 0]) = (+x3, 6);
теперь вершина x3 помечена и просмотрена; вершина x4 также помечена и просмотрена.
Пометкой для x6 будет (+x5, min [6, 25 - 0]) = (+x5, 6),
теперь вершина x5 помечена и просмотрена.
Пометкой для x7 будет (+x6, min [6, 7 - 0]) = (+x6, 6),
теперь вершина x6 помечена и просмотрена.
Пометкой для x9 будет (+x7, min [6, 15 - 4]) = (+x7, 6).
Шаги 4 и 5.
Новые потоки увеличились следующим образом:
f7, 9 = 4 + 6 = 10; f6, 7 = 0 + 6 = 6; f5, 6 = 0 + 6 = 6;
f3, 5 = 4 + 6 = 10; f2, 3 = 4 + 6 = 10; f1, 2 = 4 + 6 =10;
все остальные значения потока не изменились.
Новый вид потока и пометки вершин до стирания показаны на рис.23.
Продолжая дальше, получаем после каждого прохода алгоритма потоки и пометки, изображенные последовательно на рисунках 24 26. Алгоритм заканчивает работу, когда вершина не может быть помечена.
Поток на рис.27. является поэтому максимальным потоком со значением 29.
Рис.22. Потоки и пометки после первой итерации.
Рис. 23. Потоки и пометки после второй итерации
.
Рис. 24. Потоки и пометки после третьей итерации
Рис. 25. Потоки и пометки после четвертой итерации
Рис. 26. Потоки и пометки после пятой итерации
Рис. 27. Потоки и пометки после шестой итерации
Определить максимальный поток в сети
Рис. 28
1. Нефедов В.Н. Курс дискретной математики / В.Н. Нефедов, В.А. Осипова. М.: Изд-во МАИ, 1992. 262 с.
2. Леденева Т.М. Специальные главы математики. Дискретная математика: Учеб. пособие. Воронеж. гос. техн. ун-т. Воронеж, 1997. 130 с.
3. Лекции по теории графов/ Емеличев В.А., Мельников О.И. - М.: Наука, 1990. 384 с.
4. Кристофидес Н. Теория графов: алгоритмический подход. М.: Мир, 1978. 427 с.
1. ОПРЕДЕЛЕНИЕ МЕТРИЧЕСКИХ ХАРАКТЕРИСТК ГРАФОВ………. 1
1.1. Теоретические сведения……………………………………………. 1
1.2. Пример………………………………………………………………. 2
1.3.Упражнения …………………………………………………………..3
2. ОПРЕДЕЛЕНИЕ СИЛЬНЫХ КОМПОНЕНТ ГРАФА …………………..4
2.1. Теоретические сведения …………………………………………….4
2.2. Пример………………………………………………………………..5
2.3.Упражнения…………………………………………………………...6
3. ПОСТРОЕНИЕ ОСТОВНЫХ ДЕРЕВЬЕВ ГРАФА……………………….7
3.1. Теоретические сведения……………………………………………..7
3.2. Примеры решения задач…………………………………………….8
3.3.Упражнения…………………………………………………….........11
4. ПОСТРОЕНИЕ ЭЙЛЕРОВЫХ И ГАМИЛЬТОНОВЫХ ЦИКЛОВ
В ГРАФЕ…………………………………………………………………....13
4.1. Теоретические сведения……………………………………………13
4.2. Примеры решения задач……………………………………………15
4.3.Упражнения………………………………………………………….16
5. ОПРЕДЕЛЕНИЕ КРАТЧАЙШЕГО ПУТИ МЕЖДУ ДВУМЯ
ВЕРШИНАМИ ГРАФА. АЛГОРИТМ ДЕЙКСТРЫ…………………….18
5.1. Теоретические сведения……………………………………………18