Блог пользователя pyshnograev

Автор pyshnograev, 16 лет назад, По-русски
Довольно часто попадаются задачи на нахождение максимального потока / минимального сечения. В этом случае используют алгоритмы Форда-Фалкерсона или Эдмондса-Карпа, иногда к этому прибавляется масштабирование, что ощутимо ускоряет дело. Самой сложной частью в такой задаче считается ее сведение к вычислению потока.

Но совсем недавно я наткнулся на задачу в архиве spoj'а FASTFLOW в которой требуется вычислить в очень маленькое время максимальный поток при больших входных данных. После написания решения на Java и получения TLE я переписал его на C++, но опять алгоритм Эдмондса-Карпа с масштабированием оказался бессилен. Никаких других методов я нигде не нашел, поэтому обращаюсь за помощью. Думаю этот вопрос будет интересен не только мне, так как обычно его не освещают слишком глубоко.

Заранее благодарен.
  • Проголосовать: нравится
  • +1
  • Проголосовать: не нравится

16 лет назад, скрыть # |
 
Проголосовать: нравится +1 Проголосовать: не нравится

improved algorithm of Edmons-Karp, наверное, поможет

его описание есть на топкодере

16 лет назад, скрыть # |
 
Проголосовать: нравится +2 Проголосовать: не нравится
Скорее всего должен пройти обычный preflow-push алгоритм (прочитать можно в Кормене, или, например, здесь). В потоковых задачах он обычно самый быстрый, но даже если не прокатит, существует куча его оптимизаций (например, http://e-maxx.ru/algo/preflow_push_faster).
16 лет назад, скрыть # |
 
Проголосовать: нравится +1 Проголосовать: не нравится
Try using Dinic's algorithm.
16 лет назад, скрыть # |
 
Проголосовать: нравится 0 Проголосовать: не нравится
Just checked that push-relabel algorithm with global relabelling heuristic passes the tests.
»
14 лет назад, скрыть # |
 
Проголосовать: нравится 0 Проголосовать: не нравится

Проталкивание предпотока.

»
14 лет назад, скрыть # |
 
Проголосовать: нравится +3 Проголосовать: не нравится

To solve maximum flow problems,SAP is a good algorithm with high speed and a short code.

»
11 лет назад, скрыть # |
 
Проголосовать: нравится 0 Проголосовать: не нравится

Here is my implementation of Dinic's algorithm. I'm getting TLE. What optimization should be done? (Possibly, merging parallel edges?) Please help. (Any bug in my implementation?)