Алгоритм масштабирования потока — различия между версиями
(→Оценка сложности) |
(→Идея) |
||
Строка 7: | Строка 7: | ||
Пусть <tex> G </tex> — граф, <tex> \forall(u, v) \in EG \colon c(u,v) \in \mathbb{Z_+}, U = \max\limits_{(u, v) \in EG} c(u, v) </tex> — максимальная пропускная способность. Запишем пропускную способность каждого ребра в двоичном виде. Тогда каждое число будет занимать <tex> \lfloor \log_2 U \rfloor + 1 = n + 1 </tex> бит. | Пусть <tex> G </tex> — граф, <tex> \forall(u, v) \in EG \colon c(u,v) \in \mathbb{Z_+}, U = \max\limits_{(u, v) \in EG} c(u, v) </tex> — максимальная пропускная способность. Запишем пропускную способность каждого ребра в двоичном виде. Тогда каждое число будет занимать <tex> \lfloor \log_2 U \rfloor + 1 = n + 1 </tex> бит. | ||
− | <tex> c(u, v) = \sum\limits_{i = 0}^n a_i(u, v) 2^n, a_i(u, v) \in {0, 1} </tex> | + | <tex> c(u, v) = \sum\limits_{i = 0}^n a_i(u, v) \times 2^n, a_i(u, v) \in \{0, 1\} </tex> |
Методом Форда-Фалкерсона находим поток <tex> f_0 </tex> для графа с урезанными пропускными способностями <tex> c_0(u, v) = a_n(u, v) </tex>. | Методом Форда-Фалкерсона находим поток <tex> f_0 </tex> для графа с урезанными пропускными способностями <tex> c_0(u, v) = a_n(u, v) </tex>. |
Версия 23:43, 18 декабря 2011
Алгоритм масштабирования потока — алгоритм поиска максимального потока путём регулирования пропускной способности рёбер. Этот алгоритм работает в предположении, что все пропускные способности рёбер целые, так как они легко представимы в двоичном виде.
Содержание
Идея
Идея алгоритма в нахождении путей с высокой пропускной способностью в первую очередь, чтобы сразу сильно увеличивать поток по ним, а затем по всем остальным.
Пусть
— граф, — максимальная пропускная способность. Запишем пропускную способность каждого ребра в двоичном виде. Тогда каждое число будет занимать бит.
Методом Форда-Фалкерсона находим поток
для графа с урезанными пропускными способностями . Добавим следующий бит и находим следующее приближение для графа с новыми пропускными способностями .После
итерации получим ответ к задаче, так как после с каждым шагом приближение становится точнее.Оценка сложности
Утверждение: |
Время работы алгоритма — . |
Количество итераций — На каждом шаге алгоритм выполняет в худшем случае . Докажем, что сложность каждой итерации — . увеличений потока. Докажем это. Пусть . В конце шага множество вершин графа можно разбить на две части: и . Все рёбра, выходящие из , имеют остаточную пропускную способность менее . Наибольшее количество рёбер между и равно . Следовательно, остаточный поток (поток, который может быть получен на оставшихся шагах) на фазе с текущим значением максимально составляет . Каждый увеличивающий путь при данном имеет пропускную способность как минимум . На предыдущем шаге, с масштабом , остаточный поток ограничен . Значит максимальное число появившихся увеличивающих путей равно . Увеличивающий путь можно найти за , используя BFS. Количество шагов . Итоговая сложность . |
Псевдокод
Capacity-Scalingwhile do while в существует путь с пропускной способностью большей do путь с пропускной способностью большей увеличить поток по рёбрам на обновить