Как я могу получить элементы антицепи в SPOJ-DIVREL?

Проблема: http://www.spoj.com/problems/DIVREL

В вопросе нам просто нужно найти максимальное количество элементов, которые не являются кратными (форма a делится на b) из заданного набора элементов. Если мы просто сделаем ребро от элемента к его кратному и построим граф, это будет DAG.

Теперь вопрос просто меняется на поиск минимального количества цепей, содержащих все вершины, равные мощности антицепи, используя Теорема Дилворта, так как это частично упорядоченное множество.

Минимальные цепочки можно найти с помощью двудольного сопоставления (как: это минимальное покрытие пути), но теперь я не могу найти сами элементы антицепи?


person user3674243    schedule 25.05.2014    source источник
comment
Вы забыли (1) включить формулировку проблемы в вопрос, чтобы сделать его самодостаточным (2) Ссылку на источник (заголовок не в том месте, URL не кликабельный) (3) представить свои собственные мысли и решение идеи   -  person Niklas B.    schedule 25.05.2014
comment
Ну, вы решили (2) до сих пор, (1) и (3) идти. Кстати, я не знаком с теоремой Дилуорта, поэтому, пожалуйста, кратко опишите, что она говорит и как она применима к задаче. Также как вы применяете двудольное сопоставление, чтобы найти минимальную цепочку. Я ожидаю, что в вашем вопросе хотя бы упомянется, что делимость является отношением частичного порядка, с кратким обзором того, что это означает, как применима теорема Дилуорта, что ваш алгоритм может сделать до сих пор и что именно вам еще нужно знать. Сделайте так, чтобы нам было легче вам помочь.   -  person Niklas B.    schedule 25.05.2014
comment
Описал как смог. Пожалуйста, сообщите, если необходимо добавить дополнительную информацию. Спасибо.   -  person user3674243    schedule 25.05.2014
comment
Решение подробно описано на странице CS.stackexchange.com   -  person Niklas B.    schedule 25.05.2014


Ответы (1)


Чтобы вычислить антицепь, вы можете:

  1. Вычислить максимальное двудольное соответствие (например, с помощью алгоритма максимального потока) для новый двудольный граф D, который имеет ребро из левой части a в правую часть b тогда и только тогда, когда a делит b.
  2. Используйте сопоставление для вычисления минимального вершинного покрытия (например, с помощью алгоритма, описанного в доказательство теоремы Кенига
  3. Антицепь задается всеми вершинами, не входящими в вершинное покрытие

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

Алгоритм поиска минимального вершинного покрытия (по ссылке выше):

  1. Пусть S0 состоит из всех вершин, не совпадающих с M.
  2. Для целого числа j ≥ 0 пусть S(2j+1) будет множеством всех вершин v, таких, что v смежна некоторым ребром в E\M с вершиной в S(2j) и v не входила ни в одну из предыдущих вершин. определенное множество Sk, где k ‹ 2j+1. Если такой вершины нет, но остались вершины, не входящие ни в одно ранее определенное множество Sk, то произвольно выбираем одну из них и пусть S(2j+1) состоит из этой единственной вершины.
  3. Для целого числа j ≥ 1 пусть S(2j) будет множеством всех вершин u таких, что u смежна некоторым ребром в M с вершиной в S(2j−1). Заметим, что для каждой v в S(2j−1) существует вершина u, с которой она сопоставляется, поскольку в противном случае v была бы в S0. Поэтому M устанавливает взаимно однозначное соответствие между вершинами S(2j−1) и вершинами S(2j).

Объединение нечетных индексированных подмножеств является вершинным покрытием.

person Peter de Rivaz    schedule 25.05.2014
comment
Вопрос не в том, чтобы найти мин. вершинное покрытие. Мне нужно найти элементы набора антицепей данного набора, т.е. графа. Как здесь нужно вершинное покрытие. Нам нужно мин. покрытие пути. Не понял тебя. Пожалуйста помоги. - person user3674243; 25.05.2014
comment
@Niklas Я могу удалить этот ответ, так как он, похоже, не помогает, но я думаю, что дело в том, что делимость образует частично упорядоченный набор, и поэтому вы можете использовать двудольное сопоставление для построения минимального покрытия пути. Получив это, вы затем строите минимальное вершинное покрытие на двудольном графе, а оставшиеся вершины являются антицепью. Обратите внимание, что двудольный граф состоит из набора чисел в один и тот же набор чисел, поэтому граф отличается от исходного графа делимости. - person Peter de Rivaz; 25.05.2014
comment
@PeterdeRivaz Я понял это сейчас, прочитав страницу Википедии о теореме Дилуорта. Если вы проясните, какой график вы на самом деле имеете в виду, я думаю, что это дает хороший и правильный ответ. - person Niklas B.; 25.05.2014
comment
@PeterdeRivaz Я не могу привести вас сюда - как только вы это сделаете, вы создадите минимальное вершинное покрытие на двудольном графе, а оставшиеся вершины будут антицепью. для чего вы использовали минимальное покрытие пути, когда вы только что использовали min. вершинное покрытие, чтобы получить антицепь. - person user3674243; 25.05.2014
comment
Поскольку количество элементов равно 200. Могу ли я вернуться назад и получить элементы антицепи из цепочек, полученных в результате сопоставления. - person user3674243; 25.05.2014
comment
@user3674243 user3674243 Я не использовал минимальное покрытие пути напрямую. Вместо этого я использовал максимальное соответствие для построения минимального вершинного покрытия. (Если вам действительно нужны цепочки, то вы можете использовать то же сопоставление для построения минимального покрытия пути.) Чтобы ответить на второй вопрос, если вы создадите минимальное покрытие пути и выполните возврат, вы обнаружите цепочку, а не антицепь. - person Peter de Rivaz; 25.05.2014