Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Konspekt_lektsiy.docx
Скачиваний:
276
Добавлен:
27.03.2016
Размер:
2.04 Mб
Скачать

Лекция 14 Потоки в сетях

План лекции

  1. Постановка задачи нахождения максимального потока

  2. Решение задачи

Ключевые слова: поток, пропускная способность ребра, величина потока, увеличивающая цепь.

1 Постановка задачи нахождения максимального потока

Задача о потоке в сети формулируется следующим образом. Дан ориентированный граф, в дальнейшем называемый сетью, с одним источником s (вершиной без входящих ребер) и одним стоком t (вершиной без выходящих ребер). Каждому ребру (i, j) графа приписано положительное число c(i, j), называемое пропускной способностью ребра.

Поток в сети — это функция , определенная на ребрах графа и удовлетворяющая следующим условиям:

1) для любого графа 0 ≤ c(i, j);

2) если ,, то

(закон Кирхгофа);

3) ==v.

Число v называется величиной потока.

Задача состоит в определении функции таким образом, чтобы величина потока была максимальной.

Введем величину q = c(i,j) - . Обозначим черезQ множество ребер, для которых q(i, j) > 0, а через R — множество ребер, для которых > 0. Эти множества могут пересекаться.

Цепь Р (без учета ориентации ребер) из s в t, все ребра которой, ориентированные от s к t (прямые), принадлежат Q, а все ребра, ориентированные от t к s (обратные), принадлежат R, называется увеличивающей. На рисунке 32 ребра (s, а), (а, b), (d, t) — прямые, а ребра (с, b), (d, с) — обратные.

Рисунок 32 – Увеличивающая цепь

Если в сети с заданным потоком существует увеличивающая цепь, то величину потока в сети можно увеличить, изменяя величины потока на ребрах этой цепи. Рассмотрим, как это сделать.

2 Решение задачи

Первое (выходящее из s) и последнее (входящее в t) ребра увеличивающей цепи - всегда прямые. Любую неконцевую вершину j этой цепи можно отнести к одному из трех классов.

1. Входящее в нее ребро (i, j) и выходящее ребро (j, k) — прямые. На этих ребрах поток можно увеличить на одно и то же число, но не более, чем на величину min{q(i, j), q(j, k)} — при этом закон Кирхгофа в вершине j не будет нарушен. На рисунке 32 к этому классу относится вершина а.

2. Входящее в нее (со стороны s) ребро (j, i) и выходящее (в сторону t) ребро (k, у) — обратные. На этих ребрах поток можно уменьшить на одно и то же число, но не более, чем на величину min{,} — при этом закон Кирхгофа также не будет нарушен. На рисунке 32 к этому классу относится вершинас, для которой входящим ребром считаем (с, b), а выходящим — (d, с).

3. Входящее ребро () — прямое, а выходящее ребро(k, j) — обратное, либо наоборот: входящее — обратное, а выходящее — прямое. В обоих случаях можно на прямом ребре поток увеличить, а на обратном — уменьшить на одну и ту же величину, не превосходящую

min{g(),f(k, j)}.

На рисунке 32 к этому классу относятся вершины b (первый случай) и d (второй случай).

На всех прямых ребрах увеличивающей цепи увеличим поток на величину min{min{g()},min{}}, а на всех обратных ребрах — уменьшим его на ту же величину. Тогда, поскольку первое и последнее ребра цепи — прямые, на эту величину возрастет и общая величина потока. Таким образом, поток в сети можно увеличивать до тех пор, пока в сети есть увеличивающие цепи.

В нашем примере min{min{ g()},min{}} = 2.

Схема алгоритма поиска увеличивающей цепи.

1. Пометить s.

2. Для помеченной вершины найти смежную с ней непомеченную вершину , содержащуюся либо вQ, либо в R: а) если ()Q, пометить и (); б) если ()R, пометить и (,).

3. Остановиться, если либо помечена t, либо шаг 2 невозможен. Иначе перейти к шагу 2.

Помеченные вершины и ребра образуют дерево, поскольку ребра, соединяющие две помеченные вершины, не рассматриваются. Поэтому, если t помечена, то тем самым построена единственная помеченная цепь из s в t, которая является увеличивающей. Если же шаг 3 невозможен, a t не помечена, то увеличивающих цепей нет.

Описанная схема становится конкретным алгоритмом, если зафиксировать правила выбора помеченной вершины и непомеченной вершины (в случае, когда дляi имеется несколько вершин , удовлетворяющих условиям п. 2). Построенное дерево зависит от выбора этого правила.

Таким образом, общий алгоритм нахождения максимального потока формулируется следующим образом.

1. Определить начальный поток (например, нулевой).

2. Определить множества Q, R.

3. Найти увеличивающую цепь и провести на ней максимальное увеличение потока. Если такой цепи нет, закончить алгоритм. Иначе перейти к шагу 2.

На рисунке 33 приведен пример построения максимального потока, которое заканчивается за три цикла. Вершины обозначены буквами, пропускные способности — прямыми жирными цифрами, поток на ребрах — курсивными нежирными цифрами. Отсутствие потока на ребре означает, что он равен нулю.

Рисунок 33 – Пример построения максимального потока

Теорема. Поток, построенный описанным алгоритмом, максимален.

Введем понятие разреза. Разрезом связного графа называется множество ребер, удаление которых делает граф несвязным. Весь поток в сети должен проходить через все разрезы. Пропускная способность разреза К равна

Поэтому max v = .Алгоритм построения потока завершается, когда больше нет увеличивающих цепей. Рассмотрим неориентированное дерево, построенное на последнем шаге алгоритма поиска увеличивающей цепи, и выделим ребра, соединяющие его помеченные ребра с непомеченными. Эти ребра образуют разрез К0. Прямые ребра этого разреза не принадлежат Q (иначе бы алгоритм продолжился). Следовательно, для этих ребер f(i, j) = c(i, j), и поток по ним увеличить нельзя. Обратные ребра не принадлежат R, поэтому для них , т.е. поток в них отсутствует, и, значит, обратного потока через них нет. Следовательно, построенный поток черезК0. равен его пропускной способности. и увеличить его нельзя.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]