|
Кружок обучения мастерству программирования при СПбГУ |
Лекции группы A0 - Лекция 08 - Про разрезы (Коля Мальковский, Сергей Копелиович)
Note: Звездочкой отмечены темы, на которые на лекции времени не хватило.
Краткий план лекции "Про разрезы"
- Рандомизированный алгоритм Каргера-Штейна (поиск глобального разреза в графе за O(n^2*P(log)))
- Алгоритм Хао-Орлина (поиск глобального разреза в графе за O(n^3))
- Алгоритм Штор-Вагнера (http://e-maxx.ru/algo/stoer_wagner_mincut)
- Задача о поиске K-й порядковой статистики на отрезке за O((logn)^2)
- B-Tree
- Задача 10 с Всесиба = Алгоритм Евклида
Полный план лекции
- Алгоритмы поиска глобального разреза
- Рандомизированный алгоритм Каргера-Штейна (поиск глобального разреза в графе за O(n^2*P(log)))
- Условие = единичная сеть без кратных ребер
- Простейший алгоритм за O(n^4*P(log))
- Модификация = каждую 1/2 вероятности создаем 2 ветки рекурсии
- Оценка вероятности как O(1/logn) (решим диффур)
- Способ за O(n) выбрать случайное ребро (с учетом кратности)
- Алгоритм Хао-Орлина (поиск глобального разреза в графе за O(n^3))
- s = rand(), t = rand(), h[v != t] = 1, h[t] = 0
- S = D[0] = {s}, W = V-s
- Ищем поток алгоритмом preflow push, push делаем только в W
- ReLabel(v) = если вершина оставит после себя дырку в высотной функции => добавить D[k++] = {x : h[x] >= h[v]},
если вершины не имеет ненасыщенных ребер идущих в W (из нее уже не достижим t) => D[k++] = {v}
- Нашли поток между t и s. Теперь склеить t и s. Для этого из t весь избыток вытолкнем по обратным ребер,
и поместим эту вершину в S (D[0]).
- Выбор нового стока : (W = empty => W := D[--k]), t = вершина в W минимальной глубины
- В процессе работы алгоритма h[t] = 0,1,2,3... => h[v] <= 0+n, 1+(n-1), 2+(n-2)... <= n
- Время работы = O(времени preflow-push)
- Алгоритм Штор-Вагнера (http://e-maxx.ru/algo/stoer_wagner_mincut)
- Собственно алгоритм
- Реализации за O(V^3), O(VElogV), O(V^2logV + VE)
- Доказательство
- Задача о поиске K-й порядковой статистики на отрезке
- [O(n), O(sqrt(n)*logn)]
- [O(n), O(n^{eps}*logn)]
- [O(nlogn), O((logn)^2)]
- [O(n^2), O(logn)]
- [O(n^3), O(1)]
- Случай, когда отрезок меняется, [O(nlogn), O((logn)^3)]
- Дополнительно
- Поиск обратного к x mod 2^n за O(logn)
- B-Tree
- 2D-Dynamic-Interval-Tree + BS-Tree inside
- * Задачка с всесиба (подробно, с доказательствами)
- * (4) = Хэши + Паросочетание
- * (6) = Динамика
- * (7) = Квадродерево
- (10) = Алгоритм Евклида