Задача о максимальном потоке в сети Алгоритм Фалкерсона-Форда Постановка задачи Пункт 0 (вход, источник) и пункт n (выход, сток) и каждой дуге (отрезку), связывающей пункты i и j, сопоставлено число dij>0 Количество вещества, проходящего по дуге от i до j, будем называть потоком по дуге (i, j) и обозначать через Xij . Очевидно, что 0≤Xij≤dij для всех i, j X X i i 0j ij X jk k X in Z i Величину Z называем величиной потока в сети и ставим задачу максимизации Z. Алгоритм Фалкерсона-Форда 1. 2. 3. Обнуляем все потоки. Остаточная сеть изначально совпадает с исходной сетью. В остаточной сети находим любой путь из источника в сток. Если такого пути нет, останавливаемся. Пускаем через найденный путь (он называется увеличивающим путём или увеличивающей цепью) максимально возможный поток: 1. 2. 3. На найденном пути в остаточной сети ищем ребро с минимальной пропускной способностью cmin. Для каждого ребра на найденном пути увеличиваем поток на cmin, а в противоположном ему - уменьшаем на cmin. Модифицируем остаточную сеть. Для всех рёбер на найденном пути, а также для противоположных им рёбер, вычисляем новую пропускную способность. Если она стала ненулевой, добавляем ребро к остаточной сети, а если обнулилась, стираем его. 4. Возвращаемся на шаг 2. 1. 2. Подбирается поток с ненулевой частотой. В нашем случае в скобках указан поток. zij ≤dij Исходя из заданной сети N строим новую сеть N' следующим образом: любая дуга, из которой zl=0 (старый поток) остается в новой сети с той же пропускной способностью, если же zl≠0, эта дуга заменяется двумя дугами – одна в том же направлении с пропускной способностью Ul-xl и обратная к xl. 3. Если в новой сети можно найти ненулевой поток, то добавляем его к исходному, и получаем поток больше исходного до тех пор, пока на шаге три для очередной сети мы не сможем найти ненулевой поток. F’=4+1=5 Алгоритмы Алгоритм Краскалла Алгоритм Дейкстры Остов минимального веса Задача нахождения остова минимального веса во взвешенном связном графе, возникает при проектировании линий электропередачи, трубопроводов, дорог и т.п., когда требуется заданные центры соединить некоторой системой каналов, связных либо непосредственно соединяющим их каналом, либо через другие центры и каналы, так, чтобы общая длина (или, например, стоимость) каналов связи была минимальной. Решение этой задачи «слепым» перебором вариантов потребовало бы чрезвычайно больших вычислений даже при относительно малых n (можно доказать, что полный граф Kn содержит nn–2 различных остовных дерева). Однако для ее решения имеются эффективные алгоритмы. Опишем два из них - алгоритмы Дж. Краскала (1956) и Р. Прима (1957), применяемые к произвольному связному графу (G, w) порядка n. Алгоритм Краскалла Шаг 1. Строим граф T1=On+e1, присоединяя к пустому графу на множестве вершин VG ребро e1∈VG минимального веса. Шаг 2. Если граф Ti уже построен и i<n–1, то строим граф Ti+1=Ti+ei+1, где ei+1 – ребро графа G, имеющее минимальный вес среди ребер, не входящих в Ti и не составляющих циклов с ребрами из Ti. Задание Построить связный 9-вершинный граф, без петель и кратных ребер. Случайным образом распределить веса ребер. С помощью алгоритма Краскалла найти остов минимального веса. Задание Дан граф, найти остов минимального веса. 4 3 2 8 5 3 4 1 9 6 7 4 5 2 2 6 1 5 3 7 Задача о минимальной связке Найти остовное дерево графа с наименьшим весом, используя алгоритм Краскалла. 9 12 2 7 11 3 2 6 4 1 7 6 4 8 5 3 1 1 6 2 1 7 8 5 4 9 6 10 3 11 Задача о кратчайшей цепи Задача о кратчайшем пути. Пусть задана сеть из n + 1 вершины, то есть ориентированный граф, в котором выделены две вершины – вход (нулевая вершина) и выход (вершина с номером n). Для каждой дуги заданы числа, называемые длинами дуг. Длиной пути (контура) называется сумма длин входящих в него дуг (если длины дуг не заданы, то длина пути (контура) определяется как число входящих в него дуг). Задача заключается в поиске кратчайшего пути (пути минимальной длины) от входа до выхода сети. Известно, что для существования кратчайшего пути необходимо и достаточно отсутствия в сети контуров отрицательной длины. Алгоритм Дейкстры Алгоритм основан на приписывании узлам временных или постоянных меток. Первоначально только источнику приписывается постоянная метка, равная нулю. Всем другим узлам приписываются временные метки, соответствующие весу дуги из источника в рассматриваемый узел. Если такой дуги нет, то узлу приписывается временная метка, равная бесконечности. Алгоритм Дейкстры Для определения ближайшего к источнику узла выберем временную метку с минимальным значением и объявим ее постоянной. Затем, до тех пор, пока стоку не будет приписана постоянная метка, необходимо выполнить следующее: Алгоритм Дейкстры Рассмотреть оставшиеся узлы с временными метками. Сравнить величину каждой временной метки с суммой величин последней из постоянных меток и веса дуги, ведущей из соответствующего постоянно помеченного узла в рассматриваемый. Минимальная из двух сравниваемых величин определяется как новая временная метка рассматриваемого узла. 2. Среди временных меток выбрать минимальную и объявить ее постоянной. После постоянного помечивания стока алгоритм прекращает работу, при этом минимальная сумма весов дуг, соединяющий источник и сток, равна постоянной метке стока. Искомая цепь состоит из дуг, для каждой из которых разность между постоянными метками ее концевых узлов равна весу этой дуги. 1. Задание 1 Дана сеть. Определить ориентированную цепь из узла S в узел t, сумма весов дуг которой минимальна. V1 1 V2 10 2 2 3 3 6 S t 3 V3 3 1 7 5 V4 1 V5 Задание 2 Дана сеть. Определить ориентированную цепь из узла S в узел t, сумма весов дуг которой минимальна. 4 3 2 8 5 3 1 9 6 S 4 t 7 4 5 2 2 6 1 5 3 7 Задание 3 Дана сеть. Определить ориентированную цепь из узла S в узел t, сумма весов дуг которой минимальна. V1 5 V2 12 S 2 6 4 V4 V5 3 4 8 3 8 t 7 2 12 V6 V3 6 9 8 5 V7 V8