Пример решения задачи о максимальном потоке и минимальном разрезе
Рассмотрим конкретную задачу о нахождении максимального потока в сети.
Дана сеть G(V,E) (рис.1) с источником s и стоком t. Пропускные способности дуг указаны. Найти максимальный поток из s в t.
Рис.1
Решение.
Подготовительный этап.
М(s)=(s, +∞); все дуговые потоки нулевые − для любой дуги .
Вершина s помечена и не просмотрена, остальные вершины не помечены.
Этап расстановки пометок
Рассматриваем вершину s:
М(1)=( ,10); М(2)=( ,8)
Вершина s помечена и просмотрена, вершины 1, 2 помечены и непросмотрены.
Рассматриваем вершину 1:
М(3)=(1 , 5)
Вершина 1 помечена и просмотрена.
Рассматриваем вершину 2:
М(4)=(2 , 8)
Вершина 2 помечена и просмотрена.
Рассматриваем вершину 3:
М(t)=(3 , 5)
Помечена вершина t, переходим на следующий этап.
Этап изменения потока
=5
Путь, по которому мы пришли из вершины s в вершину t:
( ,1 ,3 , t)
Величина потока r = 5.
Рис.2
В прямоугольниках (рис.2) указаны дуговые потоки после этого этапа, все остальные дуговые потоки равны нулю.
Этап расстановки пометок
Рассматриваем вершину s:
М(1)=( ,5); М(2)=( ,8)
Вершина s помечена и просмотрена, вершины 1, 2 помечены и непросмотрены.
Рассматриваем вершину 1:
Вершину 3 из вершины 1 пометить нельзя.
Вершина 1 помечена и просмотрена.
Рассматриваем вершину 2:
М(4)=(2 , 8)
Вершина 2 помечена и просмотрена.
Рассматриваем вершину 4:
М(t)=(4 , 8)
Вершина 4 помечена и просмотрена. Пометили вершину t.
Этап изменения потока
=8
Путь, по которому мы пришли из вершины s в вершину t:
( ,2 ,4 , t)
Величина потока r = r+8=13.
Рис.3
Дуговые потоки после этого этапа указаны на рис.3, все остальные дуговые потоки равны нулю.
Этап расстановки пометок
Рассматриваем вершину s:
М(1)=( ,5)
Вершину 2 из вершины s пометить нельзя.
Вершина s помечена и просмотрена, вершина 1 помечена и непросмотрена.
Рассматриваем вершину 1.
М(2)=( ,5)
Вершины 3 и 4 из вершины 1 пометить нельзя.
Вершина 1 помечена и просмотрена, вершина 2 помечена и непросмотрена.
Рассматриваем вершину 2.
М(4)=(2 , 2)
Вершина 2 помечена и просмотрена, вершина 4 помечена и непросмотрена.
Рассматриваем вершину 4.
М(t)=(4 , 2)
Вершину 3 из вершины 1 пометить нельзя.
Вершина 4 помечена и просмотрена. Пометили вершину t.
Этап изменения потока
=2
Путь, по которому мы пришли из вершины s в вершину t:
( , 1 , 2 ,4 , t)
Величина потока r = r+2=15.
Рис.4
Дуговые потоки после этого этапа указаны на рис.4, все остальные дуговые потоки равны нулю.
Этап расстановки пометок
Рассматриваем вершину s:
М(1)=( ,3)
Вершину 2 из вершины s пометить нельзя.
Вершина s помечена и просмотрена, вершина 1 помечена и непросмотрена.
Рассматриваем вершину 1.
М(2)=( , 3)
Вершины 3 и 4 из вершины 1 пометить нельзя.
Вершина 1 помечена и просмотрена, вершина 2 помечена и непросмотрена.
Рассматриваем вершину 2.
Из вершины 2 других вершин пометить не удается.
На этом этапе других вершин пометить не удалось, следовательно максимальный поток найден r =15, а минимальный разрез имеет следующий вид:
=
Задача о кратчайшем пути.
Пусть задана сеть G = с множеством вершин N, где , и множеством дуг U, т.е. задан ориентированный граф с n + 1 вершиной, в котором выделены две вершины – вход (нулевая вершина) и выход (вершина с номером n). Для каждой дуги (i; j) задано число , называемое длиной дуги. Длиной пути называется сумма длин дуг этого пути (если длины дуг не заданы, то длина пути определяется как число дуг пути, т.е. ). Задача о кратчайшем пути состоит в поиске минимального (кратчайшего) по длине пути из вершины с номером 0 до вершины с номером n.
В дальнейшем будем предполагать:1) сеть не имеет контуров; 2) из вершины с номером 0 можно попасть (по некоторому пути) в любую другую вершину сети, а из любой вершины сети можно попасть (по некоторому пути) в вершину с номером n; 3) нулевая вершина не имеет входящих дуг, а вершина n не имеет выходящих дуг.
Сеть G не имеет контуров, поэтому всегда можно пронумеровать вершины таким образом, что для любой дуги (i, j) имеет место соотношение: i<j. Такая нумерация вершин сети называется правильной.
Если сеть G имеет правильную нумерацию (вершин), то кратчайший путь можно найти алгоритмом 1. В процессе работы этого алгоритма каждая вершина получает метку − вершина i получает метку M(i) =(j, ), где первая часть метки указывает номер вершины, из которой помечена вершина i, а величина указывает длину кратчайшего пути из нулевой вершины в данную вершину.
Алгоритм 1.
Шаг 0: помечаем нулевую вершину − M(0) = (0, ), где = 0.
Шаг k, где : помечаем вершину с номером k меткой M(k) =(j, ), где (т.е. минимум в соотношении достигается на вершине j ).
Длина кратчайшего пути равна . Используя первую часть метки вершины, двигаемся в обратном направлении от вершины с номером n до вершины с номером 0 и тем самым определяем путь, по которому мы пришли из вершины 0 в вершину n. В результате мы получаем последовательность вершин: . (Такой способ определения пути называется методом обратного хода.) Это и есть кратчайший путь.
Рис. 1
На рисунке 1 приведен пример применения алгоритма 1 для определения кратчайшего пути: числа у дуг равны длинам дуг, метки вершин помещены в круглые скобки, кратчайший путь выделен жирными линиями.
Правильная нумерация вершин произвольной сети, не имеющей контуров, определяется алгоритмом 2. В процессе работы этого алгоритма каждая вершина получает метку − её номер при правильной нумерации вершин. Перед началом работы алгоритма все вершины не помечены.
Алгоритм 2.
1.Полагаем, что i = 0. Находим в сети G вершину, не имеющую входящих дуг, и присваиваем ей метку i.
2. Если i = n, то правильная нумерация вершин найдена, заменяем исходную нумерацию вершин правильной − конец работы алгоритма.
В противном случае полагаем i = i + 1.
3. Находим в сети G любую вершину, которая не имеет входящих дуг, выходящих из помеченных вершин, и присваиваем ей метку i. Возвращаемся на шаг 2.
Рис. 2.
На рисунке 2 приведен пример применения алгоритма 2 для отыскания правильной нумерации вершин сети: метки вершин − номера правильной нумерации помещены в круглые скобки.
Следующий алгоритм дает возможность определить кратчайший путь в общем случае − при произвольной нумерации вершин. В процессе работы этого алгоритма каждая вершина получает метку − вершина i получает метку M(i) =(j, ), где первая часть метки указывает номер вершины, из которой помечена вершина i, а величина указывает длину некоторого пути из нулевой вершины в данную вершину. После завершения работы алгоритма величина будет равна длине кратчайшего пути из нулевой вершины в данную вершину.
Алгоритм 3 (алгоритм Дейкстры).
Шаг 0. Полагаем, что множество вершин Q − это пустое множество. Помечаем нулевую вершину: M(0) = (0, ), где = 0, т.е. M(0) = (0,0). Заносим нулевую вершину в множество Q. Все остальные вершины получают метку − M(i) =(0, ), т.е. = (это означает, что вершина i помечена из вершины 0 и, предположительно, находится от нее на бесконечном расстоянии).
Шаг 1. Для каждой вершины k Q вычисляем величину (минимум берется по всем вершинам i таким, что i Q и в сети имеется дуга (i,k), и этот минимум достигается на вершине j). Среди всех таких вершин k выбираем ту, которая имеет минимальную величину , помечаем ее − M(k) =(j, ) и заносим в множество Q.
Подобную процедуру повторяем до тех пор, пока не будет помечена вершина n.
Длина кратчайшего пути равна . Используя первую часть метки вершины, находим сам кратчайший путь методом обратного хода.
Конец работы алгоритма.
Рис.3.
Применим алгоритм Дейкстры к графу на рис. 3, числа в кружочках равны длинам дуг.
Шаг 0.
M(0) = (0,0),
M(i) =(0, ) для i = 1,2,…,n
Q = {0}
Шаг 1.
; ;
M(3) =(0, 3)
Q = {0, 3}
; ;
M(2) =(3, 8);
Q = {0, 3, 2}
; ;
Q = {0, 3, 2, 4}
; ;
Q = {0, 3, 2, 4, 1}
;
Q = {0, 3, 2, 4, 1, 5}
Рис.4
На рисунке 4 приведен пример применения алгоритма 1 для определения кратчайшего пути: числа у дуг равны длинам дуг, метки вершин помещены в круглые скобки, кратчайший путь выделен жирными линиями.
Варианты индивидуальных заданий
Каждый студент должен произвольно задать сеть с характеристиками, выбранными соответственно номеру в журнале.
Состав отчета работы
1. Краткие теоретические сведения.
2. Индивидуально построенную сеть с вариантом входных данных.
3. Полные расчеты на сети для задач поиска максимального потока и кратчайшего пути.
4. Выводы из лабораторной работы.
Исходные данные:
Интервалы весов | Группа 1 | Группа 2 | ||||
G1 | G2 | G1 | G2 | |||
(i,j) | (i,j) | (i,j) | (i,j) | |||
1−7 | (7;12) | (6;13) | (7;11) | (7;12) | ||
8−15 | (7;13) | (7;9) | (6;10) | (7;13) | ||
10−18 | (7;11) | (7;10) | (6;11) | (7;11) | ||
1−7 | (6;10) | (6;9) | (6;12) | (6;10) | ||
8−15 | (6;11) | (6;12) | (6;13) | (6;11) | ||
10−18 | (6;12) | (6;13) | (7;9) | (6;12) | ||
1−7 | (6;13) | (7;9) | (7;10) | (6;13) | ||
8−15 | (7;9) | (7;10) | (6;9) | (7;9) | ||
10−18 | (7;10) | (6;9) | (6;12) | (7;10) | ||
1−7 | (6;9) | (7;12) | (6;13) | (6;9) | ||
8−15 | (6;10) | (7;13) | (7;9) | (7;12) | ||
10−18 | (7;13) | (7;11) | (7;10) | (7;13) | ||
1−7 | (7;11) | (6;10) | (7;13) | (7;11) | ||
8−15 | (6;10) | (6;11) | (7;11) | (6;10) | ||
10−18 | (6;11) | (6;12) | (6;10) | (6;11) | ||
1−7 | (6;12) | (6;13) | (6;11) | (6;12) | ||
8−15 | (6;13) | (7;9) | (6;12) | (7;9) | ||
10−18 | (7;9) | (7;11) | (6;13) | (6;9) | ||
1−7 | (7;10) | (6;10) | (7;9) | (7;10) | ||
1−7 | (6;9) | (6;11) | (7;10) | (6;9) | ||
8−15 | (6;12) | (6;14) | (6;9) | (6;12) | ||
10−18 | (6;13) | (6;13) | (7;12) | (6;13) | ||
1−7 | (7;9) | (7;9) | (6;2) | (7;9) | ||
8−15 | (7;10) | (7;10) | (6;4) | (7;10) | ||
10−18 | (6;9) | (7;11) | (6;1) | (6;9) |
Первый столбец − параметры графа G , второй − графа G . В паре (i,j) первое число − число вершин, второе число − число дуг.
G − сеть для задачи о максимальном потоке, G − для задачи о кратчайшем пути. Интервалы весов указывают границы изменения пропускных способностей и длин дуг.