Минимальное остовное дерево с двойным весом


12

Рассмотрим граф G(V,E) . Каждое ребро имеет два веса и . Найдите остовное дерево, которое минимизирует произведение . Алгоритм должен работать за полиномиальное время относительно,A e B e ( e T A e ) ( e T B e ) | V | , | E |eAeBe(eTAe)(eTBe)|V|,|E|

Мне трудно адаптировать любой из традиционных алгоритмов на связующих деревьях (Kruskal, Prim, Edge-Deletion). Как это решить? Есть намеки?


Возможно попытайтесь построить новый граф, где вес ребра равен . emax(Ae,Be)
12

3
Это домашняя проблема / упражнение? Если так, это из учебника? Причина, по которой я спрашиваю, заключается в том, что контекст может помочь «перепроектировать» проблему. Не сразу очевидно, что жадный алгоритм уместен здесь, но если он идет из главы о жадных алгоритмах ...
Джо

1
@utdiscant, это не сработает. Отрицательные края могут быть полезны.
Николас Манкузо

даже для положительных ребер бесполезно, например, пара (10,10) не лучше, чем пара (11,1) в большинстве случаев.

Ответы:


1

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

Алгоритм

Для каждого из ваших ребер пометьте их от дон1n

Пусть вес A ребра номер яaii

Пусть вес B ребра номер яbii

Составьте эту таблицу

   |a_1 a_2 a_3 a_4 .. a_n
---+-------------------------
b_1|.........................
b_2|.........................
 . |.........................
 . |.........................
b_n|...................a_n * b_n

Каждый элемент таблицы является произведением строки и столбца.

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

Найдите ребро с наибольшей суммой, удалите это ребро, если оно не отключает график. Отметьте край как необходимый в противном случае. Если ребро было удалено, заполните его строки и столбцы 0.

правильность

Результат, очевидно, дерево.

Результат явно охватывающий, так как никакие вершины не разъединены.

Результат минимален? Если есть другой край, удаление которого приведет к созданию меньшего остовного дерева в конце алгоритма, то этот край был бы сначала удален и обнулен. (если бы кто-нибудь мог помочь мне сделать этот пример более строгим и / или встречным, тогда это было бы здорово)

время выполнения

Очевидно, многочлен от,|V|

редактировать

(2,11),(11,2),(4,6) это не счетчик пример.

a1=2,a2=11,a3=4

b1=11,b2=2,b3=6

потом

   | 2     11     4
---+--------------------
11 | 22    121    44
 2 | 4     22     8
 6 | 12    66     24

(4,6)=44+8+24+66+12=154(2,11)=22+4+12+121+44=203(11,2)=121+22+66+4+8=221

(11,2) удаляется.

В итоге(2,11),(4,6)=617=102

Другие остовные деревья

(11,2),(4,6)=1512=180

(2,11),(11,2)=1313=169


1
Мне кажется, это довольно жадный подход. Меня не убеждает ваше «доказательство» минимализма.
Нейц

1
@SaeedAmiri Как это контрпример? Я разместил работу в отредактированном разделе, алгоритм дает правильный результат.
Герп Дерпингтон

1
Что вы сделали, так это выяснили, сколько каждый вносит в , и вы выбираете те, которые оказывают наибольшее влияние. Это хорошо, но это не то, что требуется. Это сложный вопрос. Если вы хотите улучшить свой ответ, вам нужно прийти с доказательством. В противном случае, нет смысла. (ai,bi)eEai.eEbi
AJed

очень несправедливо получить отрицательный отзыв за ваши усилия.
AJed

@AJed Доказательство точно такое же, как при удалении prim / kush / reverse. Все, что мы должны доказать сейчас, это то, что свойство cut все еще сохраняется.
Герп Дерпингтон

1

Это решение от http://www.cnblogs.com/autsky-jadek/p/3959446.html .

Мы можем рассматривать каждое остовное дерево как точку на плоскости , где - сумма веса , y - сумма веса . Цель состоит в том, чтобы минимизировать .xyxeTAeeTBexy

  1. Найти минимум остова в соответствии с весом и вес . Таким образом , мы имеем две точки в плоскости ху . Во всех точках связующего дерева на плоскости, имеет минимум , имеет минимумABA,BAxBy .

  2. Теперь мы стремимся найти точку в треугольнике которая имеет максимальное расстояние до линии , чтобы можно было минимизировать значение для для всех точек в треугольнике .COABABxyCABC

Потому что .2SABC=|AB×AC|=(BxAx,ByAy)×(CxAx,CyAy)=(BxAx)Cy+(AyBy)CxAy(BxAx)+Ax(ByAy)

  1. Обратите внимание, что является константой, поэтому теперь мы стремимся максимизировать . Поэтому мы создаем новый граф , в то время как вес . Теперь мы запускаем максимальное связующее дерево на , чтобы получить точку .Ay(BxAx)+Ax(ByAy(BxAx)Cy+(AyBy)CxG=(V,E)w(e)=Be(BxAx)+Cx(AyBy)GC

  2. Прогоните выше алгоритма на рекурсивно, пока не более остовных деревьев между и .B C , A C OOBC,OACBC,ACO

  3. Теперь мы получаем множество возможных связующих деревьев. Рассчитайте значение для каждого дерева, чтобы получить минимальное дерево.xy

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.