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

Автор Edvard, 10 лет назад, По-русски

Доброго времени суток Codeforces!

Хочется посабмитить циркуляцию наименьшей стоимости, кто-нибудь помнит задачи на такую тему (или просто на нахождение циркуляции, на нахождение отрицательного цикла, на нахождение кратчайшего отрицательного цикла, отрицательного цикла наименьшего среднего веса).

  • Проголосовать: нравится
  • +72
  • Проголосовать: не нравится

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

http://codeforces.me/gym/100199 B — Reactor Cooling

http://codeforces.me/gym/100491 A — Arbitrage

http://codeforces.me/gym/100166 D — Кратчайший путь

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

Чтобы тестить циркуляцию, достаточно взять любую задачу на min cost flow и решать её как flow + min cost circulation.

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

    Если честно я как раз хочу разобраться с тем за какую асимптотику люди решают циркуляцию наименьшей стоимости. В minCostFlow я конечно могу посабмитить, но скорее всего получу TL.

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

      Почему же не зайдёт? Если циклы минимального среднего веса вычёркиваешь... А если ещё и scaling какой-нибудь делаешь, то очень даже зайдёт =)

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

        Я правильно понимаю в цикле минимального среднего веса мы минимизируем (сумму весов в цикле) / (количество вершин в цикле)? На e-maxxе об этом вскользь упоминается (говорится что можно найти за O(nm), но я пока не знаю как), но реализация похожа на поиск обычного отрицательного цикла. Scaling делается по величине среднего веса?

        UPD: Нашел в книге Ахуйи и про минимальный средний вес и про scaling.

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

          Да, правильно.

          Алгоритм Карпа за O(VE) гуглится так: "karp minimum mean cycle"

          Вот прямая ссылка

          Вот обзор про mincost алгоритмы

          Вот одна из вариаций на тему cost scaling

          Больше гуглится словами: "cost scaling min cost flow"

          Удачи ;)

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

          UPD: товарища Ахуйи чаще называют Ахьюджи =) видимо, понятно, почему...

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

Вопрос немного не по теме: кто-нибудь знает как находить min-cost-flow в сети с нижними ограничениями на пропускные способности?

Я только попробовал найти какой-то поток, потом циркуляцию наименьшей стоимости, но что-то это не взлетело :)

UPD: оказалось, что так и надо делать (под каким-то потоком имелся в виду макс поток из фиктивного стока в фиктивный исток, он же минимальный поток, удовлетворяющий ограничениям). Значит, надо выправлять руки.

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

    Точно также, как и обычный поток: добавляем ребро T->S пропускной способности +Inf, затем каждое ребро a->b с мин. ограничением L, пропускной способности H и стоимости С заменяем на ребра S'->b и a->T' пропускной способности L и одно из них делаем стоимости С, а второе — 0, а самому ребру a->b понижаем пропускную способность до H-L, а стоимость оставляем такую же. Теперь ищем макс поток из S' в T' и проверяем, равен ли он сумме всех минимальных ограничений на ребра. Если не равен, то ответа нет, иначе это и есть min-cost-flow (только важно заметить, что это не min-cost-max-flow).

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

      Спасибо!

      Я вроде так и делал, только ещё искал минимальную циркуляцию в сети без S' и T'. Но это не сработало на примере из этой задачи (рисовать, что там не так пока лень :) ).

      А на счёт макс потока из S' в T' -- он же ограничен сверху суммой минимальных ограничений, а у нас ещё может быть, допустим, цикл отрицательного веса внутри старой сети, разве нет?

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

        Ну так циклы отрицательного веса на величину потока из S' в T' не влияют.

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

          Не очень понял) А если все минимальные пропускные способности 0, то макс поток из S' в T' будет нулевым потоком стоимости 0 и мы никак не учли min-cost-flow из S в T?

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

            По определению, величина потока из S в T — это сумма потоков по ребрам исходящим из S, она же сумма потоков по ребрам входящим в T. Отрицательные циклы не влияют на величину потока из S в T, при этом они влияют на суммарную стоимость. Чаще всего в задачах, где граф нужно строить самому, отрицательных циклов ненулевой пропускной способности нет (например, в приведенной задаче из acmp), поэтому я о них и не говорил изначально. Конечно, если они есть, то нужно их искать соответствующим алгоритмом.

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

              Ок, ещё раз спасибо)

              Надеюсь, последний вопрос -- получается в общем случае всё-таки найти макс поток из S' в T' и потом убирать циклы отрицательного веса?