Алгоритм Штор-Вагнера нахождения минимального разреза — различия между версиями
Строка 48: | Строка 48: | ||
Если добавить в множество <tex>A</tex> по очереди все вершины, каждый раз добавляя вершину, наиболее сильно связанную с <tex>A</tex>, то пусть предпоследняя добавленная вершина {{---}} <tex>s</tex>, а последняя {{---}} <tex>t</tex>. Тогда минимальный <tex>s</tex>-<tex>t</tex> разрез состоит из единственной вершины {{---}} <tex>t</tex> | Если добавить в множество <tex>A</tex> по очереди все вершины, каждый раз добавляя вершину, наиболее сильно связанную с <tex>A</tex>, то пусть предпоследняя добавленная вершина {{---}} <tex>s</tex>, а последняя {{---}} <tex>t</tex>. Тогда минимальный <tex>s</tex>-<tex>t</tex> разрез состоит из единственной вершины {{---}} <tex>t</tex> | ||
|proof= | |proof= | ||
− | Рассмотрим произвольный <tex>s</tex>-<tex>t</tex> разрез <tex>C</tex> и покажем, что его вес не может быть меньше веса разреза, состоящего из единственной вершины <tex>t</tex>: | + | Рассмотрим произвольный <tex>s</tex>-<tex>t</tex> разрез <tex>C</tex> и покажем, что его вес не может быть меньше веса разреза, состоящего из единственной вершины <tex>t</tex>: |
+ | |||
<tex dpi = '130'>w(\{t\}) \le w(C)</tex>. | <tex dpi = '130'>w(\{t\}) \le w(C)</tex>. | ||
+ | |||
+ | Пусть <tex>v</tex> - вершина, которую мы хотим добавить в <tex>A</tex>, тогда <tex>A_v</tex> - состояние множества <tex>A</tex> в этот момент. Пусть <tex>C_v</tex> - разрез множества <tex>A_v \cup v</tex>, индуцированный разрезом <tex>C</tex>. Вершина <tex>v</tex> - активная, если она и предыдущая добавленная вершина в <tex>A</tex> принадлежат разным частям разреза <tex>C</tex>, тогда для любой такой вершины: | ||
+ | |||
+ | <tex dpi = '130'>w(v, A_v) \le w(C_v)</tex>. | ||
+ | |||
+ | <tex>t</tex> - активная вершина, для нее выполняется: | ||
+ | |||
+ | <tex>w(t,A_t) \le w(C_t)</tex> | ||
+ | <tex>w(t,A_t) = w(\{t\}), w(C_t) = w(C)</tex> | ||
+ | |||
+ | Получили утверждение теоремы. | ||
+ | Для доказательства воспользуемся методом математической индукции. | ||
+ | Для первой активной вершины <tex>v</tex> это неравенство верно, так как все вершины <tex>A_v</tex> принадлежат одной части разреза, а <tex>v</tex> - другой. Пусть неравенство выполнено для всех активных вершин до <tex>v</tex>, включая <tex>v</tex>, докажем его для следующей активной вершины <tex>u</tex>. | ||
+ | |||
+ | <tex> w(u,A_u) \equiv w(u,A_v) + w(u,A_u \setminus A_v)</tex> (*) | ||
+ | |||
+ | Заметим, что | ||
+ | |||
+ | <tex>w(u,A_v) \le w(v,A_v)</tex> (**) | ||
+ | |||
+ | вершина <tex>v</tex> имела большее значение <tex>w</tex>, чем <tex>u</tex>, так как была добавлена в <tex>A</tex> раньше. | ||
+ | По предположению индукции: | ||
+ | |||
+ | <tex>w(v,A_v) \le w(C_v)</tex> | ||
+ | |||
+ | Следовательно из (**): | ||
+ | |||
+ | <tex>w(u,A_v) \le w(C_v)</tex> | ||
+ | |||
+ | А из (*) имеем: | ||
+ | |||
+ | <tex>w(u,A_u) \le w(C_v) + w(u,A_u \setminus A_v)</tex> | ||
+ | |||
}} | }} |
Версия 11:52, 11 декабря 2013
Необходимые определения
- неориентированный взвешенный граф с вершинами и ребрами.
Определение: |
Разрезом называется такое разбиение множества
| на два подмножества и , что:
Определение: |
Весом разреза называется сумма весов рёбер, проходящих через разрез, т.е. таких рёбер, один конец которых принадлежит | , а второй конец - .
Эту задачу называют "глобальным минимальным разрезом". Глобальный минимальный разрез равен минимуму среди разрезов минимальной стоимости по всевозможным парам исток-сток. Хотя эту задачу можно решить с помощью любого алгоритма нахождения максимального потока (запуская его O(n^2) раз для всевозможных пар истока и стока), однако ниже описан гораздо более простой и быстрый алгоритм, предложенный Матильдой Штор (Mechthild Stoer) и Франком Вагнером (Frank Wagner) в 1994 г.
В общем случае допускаются петли и кратные рёбра, все кратные рёбра можно заменить одним ребром с их суммарным весом а петли не влияют на решение. Поэтому будем считать, что кратных ребер и петель во входном графе нет.
Алгоритм
Идея алгоритма довольно проста. Будем
раз повторять следующий процесс: находить минимальный разрез между какой-нибудь парой вершин и , а затем объединять эти две вершины в одну (создавать новую вершину, список смежности которой равен объединению списков смежности и ). В конце концов, после итерации, останется одна вершина. После этого ответом будет являться минимальный среди всех найденных разрезов. Действительно, на каждой -ой стадии найденный минимальный разрез между вершинами и либо окажется искомым глобальным минимальным разрезом, либо же, напротив, вершины и невыгодно относить к разным множествам, поэтому мы ничего не ухудшаем, объединяя эти две вершины в одну.Следовательно нам необходимо для данного графа найти минимальный разрез между какой-нибудь парой вершин
и . Для этого вводим некоторое множество вершин , которое изначально содержит единственную произвольную вершину . На каждом шаге находится вершина, наиболее сильно связанная с множеством , т.е. вершина , для которой следующая величина максимальна (максимальна сумма весов рёбер, один конец которых , а другой принадлежит ). Этот процесс завершится, когда все вершины перейдут в множество .
minCut(): v[i] - список вершин, которые были сжаты в i-тую(сначала заполняется i); for i = 1..n-1 обнуляем мн-во A; обнуляем w(связности всех вершин); for j = 1..n-1 s = вершина не из A, для которой w[s] - максимальна; if (j != n-1) добавляем s в A; пересчитываем связность w[i] для остальных вершин; prev = s; else if (w[s] < minCost) minCost = w[s]; minCut = v[s]; s и prev объединяются в одну вершину;
Корректность алгоритма
Теорема: |
Если добавить в множество по очереди все вершины, каждый раз добавляя вершину, наиболее сильно связанную с , то пусть предпоследняя добавленная вершина — , а последняя — . Тогда минимальный - разрез состоит из единственной вершины — |
Доказательство: |
Рассмотрим произвольный - разрез и покажем, что его вес не может быть меньше веса разреза, состоящего из единственной вершины :. Пусть - вершина, которую мы хотим добавить в , тогда - состояние множества в этот момент. Пусть - разрез множества , индуцированный разрезом . Вершина - активная, если она и предыдущая добавленная вершина в принадлежат разным частям разреза , тогда для любой такой вершины:. - активная вершина, для нее выполняется:
Получили утверждение теоремы. Для доказательства воспользуемся методом математической индукции. Для первой активной вершины это неравенство верно, так как все вершины принадлежат одной части разреза, а - другой. Пусть неравенство выполнено для всех активных вершин до , включая , докажем его для следующей активной вершины .(*) Заметим, что (**) вершина имела большее значение , чем , так как была добавлена в раньше. По предположению индукции:
Следовательно из (**):
А из (*) имеем: |