Алгоритм "поднять-в-начало" — различия между версиями
Whiplash (обсуждение | вклад) (→Операция разгрузки (discharge)) |
Whiplash (обсуждение | вклад) м (→Операция разгрузки (discharge)) |
||
Строка 45: | Строка 45: | ||
|proof = | |proof = | ||
Проверки операции <tex>discharge</tex>, сделанные до вызова операции проталкивания, гарантируют то, что операция <tex>push</tex> будет вызвана только тогда, когда она применима. То есть <tex>e(u) > 0</tex>, <tex>c_{f}(u, v) > 0</tex> и <tex>h(u) = h(v) + 1</tex>. | Проверки операции <tex>discharge</tex>, сделанные до вызова операции проталкивания, гарантируют то, что операция <tex>push</tex> будет вызвана только тогда, когда она применима. То есть <tex>e(u) > 0</tex>, <tex>c_{f}(u, v) > 0</tex> и <tex>h(u) = h(v) + 1</tex>. | ||
+ | }} | ||
+ | |||
+ | {{Лемма | ||
+ | |id = Лемма2 | ||
+ | |statement = | ||
+ | Когда операция <tex>discharge</tex> вызывает в операцию <tex>relabel</tex>, то для вершины <tex>u</tex> применим подъем. | ||
+ | |proof = | ||
+ | |||
}} | }} | ||
Версия 23:18, 26 декабря 2012
Алгоритм "поднять-в-начало" (relabel-to-front) основан на методе проталкивание предпотока, но из-за тщательного выбора порядка выполнения операций проталкивания и подъема, время выполнения данного алгоритма составляет , что асимптотически не хуже, чем .
Содержание
Определения
сеть с истоком и стоком , - предпоток в , - функция высоты.
-Определение: |
Допустимое ребро (admissible edge) - ребро | , у которого и . В противном случае называется недопустимым (inadmissible).
Определение: |
Допустимая сеть (admissible network) - сеть | , где - множество допустимых ребер.
Идея
Операция разгрузки (discharge)
Разгрузка (discharge) - операция, которая применяется к переполненной вершине
, для того чтобы протолкнуть поток через допустимые ребра в смежные вершины, при необходимости поднимая , делая недопустимые ребра, выходящие из вершины , допустимыми.Будем хранить для каждой вершины
список (список вершин смежных с ней). То есть список содержит каждую вершину такую, что в сети или .На первую вершину в списке указывает указатель
. Для перехода к следующей вершине в списке за , поддерживается указатель . Он равен если - последняя вершина в списке.Для каждой вершины
указатель - указатель на текущую вершину списка. Изначально .discharge(u) while e[u] > 0 v = current[u] if v = null relabel(u) current[u] = head[N[u]] else if c(u, v) > 0 and h[u] = h[v] + 1 push(u, v) else current[u] = next[v]
Докажем то, что когда операция discharge вызывает операции push и relable, эти операции применимы.
Лемма: |
Когда операция вызывает в операцию , то для пары вершин применима операция проталкивания. |
Доказательство: |
Проверки операции | , сделанные до вызова операции проталкивания, гарантируют то, что операция будет вызвана только тогда, когда она применима. То есть , и .
Лемма: |
Когда операция вызывает в операцию , то для вершины применим подъем. |
Схема алгоритма
Анализ
Источники
- Кормен Т., Лейзерсон Ч., Ривест Р. Алгоритмы: построение и анализ. — 2-е изд. — М.: Издательский дом «Вильямс», 2011. — С. 774—785.
- Алгоритм проталкивания предпотока — Википедия