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

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

Всем привет! Подскажите, как найти максимальное, но минимальное лексикографически паросочетание в уже двудольном графе?

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

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

Откуда задача?

Можно наивным путем — будем строить это паросочетание по одному ребру, пытаясь достичь лекс.минимальности, не потеряв при этом максимальность.

Сначала найдем размер макс.паросочетания. Пускай он равен Х.

Рассматриваем ребра по одному, начиная с лекс.минимального. Предположим, что какое-то ребро входит в ответ. Зафиксируем его и найдем макс.паросочетание в графе без смежных этому ребру вершин. Если размер этого паросочетания Х-1, то наше ребро входит в ответ. Если Х-2 или меньше, то не входит (потому что макс.паросочетание с этим ребром имеет размер не больше Х-1 и не является максимальным вообще). Далее аналогично находим следующие ребра ответа.

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

    Лучше не искать новое паросочетание каждый раз заново.

    Пусть у нас есть максимальное паросочетание. Построим ориентированный граф: ребра из паросочетания справа налево, остальные слева направо. Очевидно, что если найти в этом графе какой-то простой цикл, то половина его ребер из паросочетания, другая половина — не из паросочетания. Выбросим одни, добавим другие. Получим другое максимальное паросочетание.

    Тогда, чтобы проверить есть ли максимальное паросочетание с конкретным ребром, нужно проверить есть цикл, содержащий это ребро. Если он есть — то PROFIT. Иначе можно доказать, что это ребро не лежит ни в каком максимальном паросочетании.

    Итого проверяем одно конкретное ребро одним dfs, а не поиском максимального паросочетания.

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

      Спасибо, просто и красиво)

      Вариант с паросочетанием тоже не так уж и плох) Если хранить макс. паросочетание с предыдущего шага как образец, то мы можем тоже все пересчитывать быстро. В самом деле, размер паросочетания в графе, из которого мы выбросили ребро и смежные ему вершины — стал не хуже Х-2. Но он не может быть больше Х-1, потому что с удаленным ребром он не больше Х. Поэтому если взять за начальное приближение для Куна неиспорченную часть паросочетания-образца, то ее размер будет отличаться от оптимального не более чем на 1. И Куну нужно будет найти не более одной увеличивающей цепи.

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

        Причем эту цепь нужно искать только из вершины, смежной удаленному ребру.

        Вообще, идеи про поиск цепи и про поиск цикла -- они эквивалентны. Ведь если взять цикл и удалить данное ребро, то получится увеличивающая цепь. Но, подумав об этом, я нашел ошибку в своем "можно доказать, что.." :)

        Контрпример: граф с ребрами 1-1, 2-2, 3-3, 1-2, 2-3, 3-4. В нем есть два максимальных паросочетания, но нет циклов. :(

        Чтобы исправить мое утверждение про циклы, надо еще добавить исток и сток и ребра между истоком в левой долей и между стоком и правой долей. Опять же правильно их ориентировать. И теперь утверждение про цикл легко доказываться через циркуляцию потока.

        А изначальное утверждение верно для графов с полным паросочетанием. Собственно, по памяти и сформулировал, не проверил и ошибся :)

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

    В универе задали Полное условие здесь Мое решение — дихой ищу ответ, а затем проверяю куном. Однако из-за лексикографически минимального ответа падает решение.

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

      "дихой" == дихотомией == двоичным поиском?
      Просто интересно, нормально оно будет работать в худшем случае?
      Ибо O(N3logC) -- достаточно много, ИМХО, чтобы влезть в TL.

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

        Часть с дихотомией можно сделать быстрее — внутри бинарного поиска можно написать Хопкрофта-Карпа или Диница, а не Куна.

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

Чтоб наверняка — давай оно будет ещё и взвешенным :D

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

    Оно, собственно, так и есть. =))

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

      В условии действительно есть еще веса ребер. Вот только вес паросочетания -- это не сумма весов ребер, а минимум из весов ребер. :)

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

        Ах, ну да. Хитро))
        Тогда, конечно, все меняется.

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

Автор а подскажи, где ты учишься? Действительно интересно, у нас ничем подобным и "не пахнет", к сожалению..