Эта проблема является NP-трудной сокращением от Vertex крышки.
В задаче покрытия вершин нам дан граф и число , и наша задача состоит в том, чтобы определить, существует ли какое-то подмножество из не более вершин из такое, что каждое ребро в инцидентно по крайней мере с одной вершиной из . (Эквивалентно: возможно ли убить каждое ребро в , удалив не более вершин?)G=(V,E)rUrVEUGr
Во- первых, разбиение во подмножеств непересекающихся эквивалентно присвоения каждому элементу в именно один из возможных меток. Основная идея редукции создать ярлык для каждой вершины в , и «разрешить» каждому ребру быть назначен только один из двух меток , соответствующих его концов, в следующем смысле: назначая ребро в парное не этикетка вводит нет (подлинный) ограничение на то , что другие ребра могут быть назначены и ту же метку, при назначении ребра к не соответствующим предотвращает этикетки любой другой край присваивается один и тот же ярлык - что, конечно , имеет эффект выталкивания вверх число отдельных ярлыков требуется.AsAsSjvjV
Чтобы построить экземпляр вашей проблемы из экземпляра Vertex Cover:(A,a,s)(G,r)
- Установите вИ создать элемент в для каждого ребра в . (Эти пары можно рассматривать как целые числа ; любая биекция между ними подойдет.)k|E|(i,j)AvivjE1,…,k
- Установите значениеесли или ; в противном случае установите на 1.a(b,c),d|E|d=bd=ca(b,c),d
- Установите .s=r
Если является YES-экземпляром Vertex Cover, то легко увидеть, что только что экземпляр вашей проблемы также является YES-экземпляром: просто выберите метки соответствующие вершинам в любом решении и для каждого ребро Назначают соответствующий элемент какой бы ни один из знаков или был выбран (произвольно выбирать , если были выбраны оба метки). Это решение использует подмножества и является действительным, потому что единственными действующими являются те для соответствующего(G,r)SjvjUvbvc∈E(b,c)∈ASbScsaijметки, которые имеют (не) эффект предотвращения более чемребрам присваивается один и тот же ярлык.|E|
Осталось показать, что YES-экземпляр вашей проблемы подразумевает, что оригинал является YES-экземпляром Vertex Cover. Это немного более сложным, так как действительное решение к в общем случае может назначить ребро не -corresponding метка , т.е. , что означает , что мы не можем обязательно «считывать» действительную вершину крышку от действительного решения .X=(A,a,s)(G,r)YX(i,j)Smm∉{i,j}UY
Однако назначение несоответствующей метки имеет высокую стоимость, что серьезно ограничивает структуру решения: всякий раз, когда ребру назначается такая метка , с , факт что гарантирует, что это должен быть единственный край, которому назначена эта метка. Таким образом, в любом решении содержащем такое не соответствующим образом помеченное ребро , мы можем построить альтернативное решение следующим образом:(i,j)Smm∉{i,j}a(i,j),m=1Y(i,j)↦SmY′
- Произвольно выберите новую метку для как или .Sz(i,j)SiSj
- Назначьте этот новый ярлык. Если это приводит к неверному решению, это должно быть потому, что ровно одному другому ребру , уже был присвоен ярлык . В этом случае установите и перейдите к шагу 1.(i,j)(i′,j′)z∉{i′,j′}Sz(i,j)=(i′,j′)
Вышеприведенный алгоритм должен завершаться одним из двух способов: либо найдена новая метка которая не вводит противоречий, либо найден полный цикл вершин. В первом случае найдено действительное новое решение с множествами , а во втором случае найдено действительное новое решение с множествами ; В любом случае, мы построили правильное новое решение с по крайней мере еще одним ребром, назначенным соответствующей метке. После повторения всего этого процесса самое большеераз мы дадим правильное решение из которого можно будет прочитать решение исходной проблемы Vertex Cover .Szs−1s|E|Y′′
Эта конструкция явно полиномиального времени, поэтому из вашей задачи вытекает NP-сложность.