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

Автор AlexFetisov, 13 лет назад, По-русски
Добрый день) Решая ГП Европы, придумал задачу В (там где надо сориентировать ребра так, чтобы граф стал Эйлеровым), но написать уже не успевал) Потом прочитал на СФ разбор Ильи Корнакова и тихо порадовался, что знаю как решать такие задачи. Однако на пути из Питера решил написать ее в поезде и получил ВА 5. Искал баг и ничего не нашел, так и не знаю, где косяк. Вот и подумал, может кто подскажет. По шагам то, что я делаю.
1) Ищу минимальный возможный вес ребра и максимально возможный, где минимальный - это максимум из минимумов весов по каждому ребру, а максимальный - максимум всех весов.
2) Бин поиском подбираю вес
3) Строю граф по ребрам у которых вес >= текущему
4) Проверяю граф на достижимость из вершины 0.
5) Для каждой вершины читаю ее полустепень входа и выхода, потом беру минимум из этих двух величин и вычитаю из каждой этот минимум (то есть свожу одну из них в ноль)
6) Добавляю ребра из истока в каждую вершину с положительной полустепенью входа с пропускной способностью, равной этой степени, и в сток добавляю ребра из вершин с положительной полустепенью выхода, с пропускной способностью, равной этой степени.Остальные ребра добавляю в сеть такие как есть с пропускной способностью 1
7) Нахожу макс поток
8) Перебираю ребра в сети, которые не ведут из истока и в сток. Если поток по ребру положительный, то ориентирую это ребро в сторону потока.
9) Строю граф на неориентированных ребрах
10) Проверяю степень каждой вершины этого графа на четность
11) Нахожу для каждой компоненты связности Эйлеров цикл и ориентирую ребра вдоль него.
12) Строю исходный граф с найденной ориентацией ребер и нахожу Эйлеров цикл.
Может где то в логике косяк? В коде не нахожу.
  • Проголосовать: нравится
  • -10
  • Проголосовать: не нравится

13 лет назад, # |
  Проголосовать: нравится +5 Проголосовать: не нравится
Всё так, наверняка баг в реализации.

У меня логика была чуть другая: когда поток найден, можно запустить поиск Эйлерова цикла, при этом в dfs в первую очередь надо идти в ориентированные рёбра.
  • 13 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится
    Интересная мысль) Буду иметь в виду) Спасибо за проверку алгоритма, сейчас перепишу с нуля тогда)
13 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
Опять подниму этот вопрос :( не могу найти баг. переписывал, тестил, не пойму в чем косяк. может кто покажет исходник для сравнения, раз метод тот же? или еще как поможет? уже просто хочется допинать задачу, чтобы знать, что такое решать умею)
  • 13 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится
    какие-нибудь кратные рёбра, петли, что там может быть?
    • 13 лет назад, # ^ |
        Проголосовать: нравится 0 Проголосовать: не нравится
      На петли поставил отсечку - не сработала, на кратные ребра на всякий случай тоже, но по условию их нет, ну и отсечка не сработала...