Мінімальне розкидне дерево з подвійними параметрами ваги


12

Розглянемо графік . Кожен край має дві ваги та . Знайдіть розкидне дерево, що мінімізує продукт . Алгоритм повинен виконуватись у поліном час щодо.G(V,E)eAeBe(eTAe)(eTBe)|V|,|E|

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


Можливо, спробуйте побудувати новий графік, де вага краю дорівнює . emax(Ae,Be)
відверто

3
Це проблема / вправа в домашніх умовах? Якщо так, то це з підручника? Причину, про яку я запитую, полягає в тому, що контекст може допомогти «вирішити проблему». Не відразу очевидно, що алчний алгоритм тут доречний, але якщо він походить з глави про жадібні алгоритми ...
Джо,

1
@utdiscant, це не працює. Негативні краї можуть бути корисними.
Ніколас Манкузо

навіть для позитивних країв не корисно, наприклад, пара (10,10) не краща за пару (11,1) у більшості випадків.

Відповіді:


1

Я припускаю, що вам не дано від'ємних зважених граней, оскільки це може не спрацювати, якщо є негативні ваги.

Алгоритм

Для кожного свого краю позначте їх від дон1n

Нехай вага A реберного числа iaii

Нехай вага B реберного числа ibii

Складіть цю таблицю

   |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
Що ви зробили - це дізнатися, скільки кожного вносить у , і ви вибираєте ті, які мають найбільший вплив. Це добре, але це не те, що потрібно. Це складне питання. Якщо ви хочете вдосконалити свою відповідь, вам потрібно прийти з доказом. Інакше користі немає. e E a i . e E b i(ai,bi)eEai.eEbi
AJed

Дуже несправедливо голосувати за прихильність за свої зусилля.
AJed

@AJed Доказ точно такий же, як і у prim / kush / reverse delete. Все, що нам зараз доведеться довести, - це те, що властивість вирізати все ще зберігається.
Герп Дерпінгтон

1

Це рішення від http://www.cnblogs.com/autsky-jadek/p/3959446.html .

Ми можемо розглядати кожне розкинуте дерево як точку в площині , де - сума ваги , y - сума ваги . Мета - мінімізувати .x e T A ee T B e x yxyxeTAeeTBexy

  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.