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

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

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

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

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

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

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

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

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

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

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

»
10 лет назад, # |
  Проголосовать: нравится 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?)

  • »
    »
    10 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится

    Why do you post your question in all flow-related topics? It only angers people and distracts them from your blogpost.

    • »
      »
      »
      10 лет назад, # ^ |
        Проголосовать: нравится +16 Проголосовать: не нравится

      I'm so sorry. I had posted it before. But I didn't get any answers. So I thought of posting it in a flow related topic. I apologize.