Алгоритм "поднять-в-начало" — различия между версиями
Whiplash (обсуждение | вклад) |
Whiplash (обсуждение | вклад) |
||
| Строка 14: | Строка 14: | ||
== Идея == | == Идея == | ||
| + | |||
| + | |||
== Операция разгрузки (discharged) == | == Операция разгрузки (discharged) == | ||
| + | '''Разгрузка (discharge)''' - операция, которая применяется к переполненной вершине <tex>u</tex>, для того чтобы протолкнуть поток через допустимые ребра в смежные вершины, при необходимости поднимая <tex>u</tex>, делая недопустимые ребра, выходящие из вершины <tex>u</tex>, допустимыми. | ||
| + | |||
| + | Будем хранить для каждой вершины <tex>u</tex> список <tex>N[u]</tex> (список вершин смежных с ней). То есть список содержит каждую вершину <tex>v</tex> такую, что в сети <tex>G = (V, E) ~ (u, v) \in E</tex> или <tex>(v, u) \in E</tex>. | ||
| + | |||
| + | На первую вершину в списке указывает указатель <tex>head[N[u]]</tex>. Для перехода к следующей вершине в списке за <tex>w</tex>, поддерживается указатель <tex>next[w]</tex>. Он равен <tex>null</tex> если <tex>w</tex> - последняя вершина в списке. | ||
| + | |||
| + | Для каждой вершины <tex>u</tex> указатель <tex>current[u]</tex> - указатель на текущую вершину списка. Изначально <tex>current[u] = head[u]</tex>. | ||
| + | |||
| + | '''dischardge'''(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] | ||
| + | |||
== Схема алгоритма == | == Схема алгоритма == | ||
== Анализ == | == Анализ == | ||
Версия 22:39, 26 декабря 2012
Алгоритм "поднять-в-начало" (relabel-to-front) основан на методе проталкивание предпотока, но из-за тщательного выбора порядка выполнения операций проталкивания и подъема, время выполнения данного алгоритма составляет , что асимптотически не хуже, чем .
Содержание
Определения
- сеть с истоком и стоком , - предпоток в , - функция высоты.
| Определение: |
| Допустимое ребро (admissible edge) - ребро , у которого и . В противном случае называется недопустимым (inadmissible). |
| Определение: |
| Допустимая сеть (admissible network) - сеть , где - множество допустимых ребер. |
Идея
Операция разгрузки (discharged)
Разгрузка (discharge) - операция, которая применяется к переполненной вершине , для того чтобы протолкнуть поток через допустимые ребра в смежные вершины, при необходимости поднимая , делая недопустимые ребра, выходящие из вершины , допустимыми.
Будем хранить для каждой вершины список (список вершин смежных с ней). То есть список содержит каждую вершину такую, что в сети или .
На первую вершину в списке указывает указатель . Для перехода к следующей вершине в списке за , поддерживается указатель . Он равен если - последняя вершина в списке.
Для каждой вершины указатель - указатель на текущую вершину списка. Изначально .
dischardge(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]
Схема алгоритма
Анализ
Источники
- Кормен Т., Лейзерсон Ч., Ривест Р. Алгоритмы: построение и анализ. — 2-е изд. — М.: Издательский дом «Вильямс», 2011. — С. 774—785.
- Алгоритм проталкивания предпотока — Википедия