- •Решение задач теории графов методические указания
- •1. Определение метрических характеристик графов
- •1.1. Теоретические сведения
- •1.2. Пример
- •1.3. Упражнения
- •2. Определение сильных компонент графа
- •2.1. Теоретические сведения
- •2.2. Пример
- •2.3. Задачи для самостоятельного решения
- •3. Построение остовных деревьев графа
- •3.1. Теоретические сведения
- •3.2. Примеры решения задач
- •Решение Кратчайший остов для данного графа имеет следующий вид:
- •Алгоритм Прима
- •3.3. Упражнения
- •4. Построение эйлеровых и гамильтоновых циклов в графе
- •4.1. Теоретические сведения
- •4.2. Примеры решения задач
- •4.3. Упражнения
- •5. Определение кратчайшего пути между двумя вершинами графа. Алгоритм дейкстры
- •5.1. Теоретические сведения
- •5.2. Пример
- •5.3. Упражнения
- •6. Определение кратчайших путей между всеми парами вершин графа. Алгоритм флойда
- •6.1. Теоретические сведения
- •6.2. Пример
- •6.3. Упражнения
- •7. Определение максимального потока в транспортной сети
- •7.1. Теоретические сведения
- •Алгоритм Форда-Фалкерсона включает следующие шаги: а. Расстановка пометок
- •7.3 Упражнения
- •Библиографический список
- •Содержание
- •Решение задач теории графов методические указания
- •394026 Воронеж, Московский просп., 14
6.3. Упражнения
Определить кратчайшие пути между всеми парами вершин графов с использованием алгоритма Флойда
а б
в г
Рис. 20
7. Определение максимального потока в транспортной сети
7.1. Теоретические сведения
Рассмотрим граф 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. Потоки и пометки после шестой итерации