Рассмотрим граф . Каждое ребро имеет два веса и . Найдите остовное дерево, которое минимизирует произведение . Алгоритм должен работать за полиномиальное время относительно,A e B e ( ∑ e ∈ T A e ) ( ∑ e ∈ T B e ) | V | , | E |
Мне трудно адаптировать любой из традиционных алгоритмов на связующих деревьях (Kruskal, Prim, Edge-Deletion). Как это решить? Есть намеки?
Ответы:
Я собираюсь предположить, что вам не дают отрицательные взвешенные ребра, потому что это может не сработать, если есть отрицательные веса.
Алгоритм
Для каждого из ваших ребер пометьте их от дон1 n
Пусть вес A ребра номер яai i
Пусть вес B ребра номер яbi i
Составьте эту таблицу
Каждый элемент таблицы является произведением строки и столбца.
Для каждого ребра суммируйте соответствующие строку и столбец таблицы (и не забудьте удалить элемент в пересечении, так как он был суммирован дважды).
Найдите ребро с наибольшей суммой, удалите это ребро, если оно не отключает график. Отметьте край как необходимый в противном случае. Если ребро было удалено, заполните его строки и столбцы 0.
правильность
Результат, очевидно, дерево.
Результат явно охватывающий, так как никакие вершины не разъединены.
Результат минимален? Если есть другой край, удаление которого приведет к созданию меньшего остовного дерева в конце алгоритма, то этот край был бы сначала удален и обнулен. (если бы кто-нибудь мог помочь мне сделать этот пример более строгим и / или встречным, тогда это было бы здорово)
время выполнения
Очевидно, многочлен от,|V|
редактировать
потом
В итоге(2,11),(4,6)=6∗17=102
Другие остовные деревья
источник
Это решение от http://www.cnblogs.com/autsky-jadek/p/3959446.html .
Мы можем рассматривать каждое остовное дерево как точку на плоскости , где - сумма веса , y - сумма веса . Цель состоит в том, чтобы минимизировать .x−y x ∑e∈TAe ∑e∈TBe xy
Найти минимум остова в соответствии с весом и вес . Таким образом , мы имеем две точки в плоскости ху . Во всех точках связующего дерева на плоскости, имеет минимум , имеет минимумA B A,B A x B y .
Теперь мы стремимся найти точку в треугольнике которая имеет максимальное расстояние до линии , чтобы можно было минимизировать значение для для всех точек в треугольнике .C OAB AB xy C ABC
Потому что .2SABC=|AB−→−×AC−→−|=(Bx−Ax,By−Ay)×(Cx−Ax,Cy−Ay)=(Bx−Ax)⋅Cy+(Ay−By)⋅Cx−Ay(Bx−Ax)+Ax(By−Ay)
Обратите внимание, что является константой, поэтому теперь мы стремимся максимизировать . Поэтому мы создаем новый граф , в то время как вес . Теперь мы запускаем максимальное связующее дерево на , чтобы получить точку .Ay(Bx−Ax)+Ax(By−Ay (Bx−Ax)⋅Cy+(Ay−By)⋅Cx G′=(V,E) w(e)=Be(Bx−Ax)+Cx(Ay−By) G′ C
Прогоните выше алгоритма на рекурсивно, пока не более остовных деревьев между и .B C , A C OOBC,OAC BC,AC O
Теперь мы получаем множество возможных связующих деревьев. Рассчитайте значение для каждого дерева, чтобы получить минимальное дерево.xy
источник