Я собираюсь предположить, что вам не дают отрицательные взвешенные ребра, потому что это может не сработать, если есть отрицательные веса.
Алгоритм
Для каждого из ваших ребер пометьте их от дон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)(2,11)(11,2)=44+8+24+66+12=154=22+4+12+121+44=203=121+22+66+4+8=221
(11,2) удаляется.
В итоге(2,11),(4,6)=6∗17=102
Другие остовные деревья
(11,2),(4,6)=15∗12=180
(2,11),(11,2)=13∗13=169