Size negatif ağırlıklı kenarlar verilmediğini varsayacağım, çünkü negatif ağırlıklar varsa bu işe yaramayabilir.
Algoritma
Kenarlarınızın her biri için ila etiketleyinn1n
Kenar numarası ağırlığı A olsun benbirbenben
Kenar numarası ağırlığı B olsun benbbenben
Bu tabloyu hazırla
|a_1 a_2 a_3 a_4 .. a_n
---+-------------------------
b_1|.........................
b_2|.........................
. |.........................
. |.........................
b_n|...................a_n * b_n
Tablo öğelerinin her biri satır ve sütunun ürünüdür.
Her kenar için, ilgili tablo satırını ve sütununu toplayın (ve iki kez toplandığından kesişimdeki öğeyi kaldırmayı unutmayın).
En büyük toplamı olan kenarı bulun, grafiğin bağlantısını kesmezse bu kenarı silin. Aksi takdirde kenarı işaretleyin. Bir kenar silinmişse, satırlarını ve sütunlarını 0 ile doldurun.
doğruluk
Sonuç açıkça bir ağaçtır.
Hiçbir köşenin bağlantısı kesilmediği için sonuç açıkça değişiyor.
Sonuç minimal mi? Silme işlemi algoritmanın sonunda daha küçük bir yayılan ağaç oluşturacak başka bir kenar varsa, önce o kenar silinir ve geçersiz olur. (eğer birisi bunu biraz daha titiz / ve / veya karşı örnek yapmama yardımcı olabilirse, bu harika olurdu)
Çalışma süresi
Açıkça polinom.| V|
Düzenle
( 2 , 11 ) , ( 11 , 2 ) , ( 4 , 6 ) bir değil, bir karşı, örneğin.
bir1= 2 , bir2=11,a3=4
b1= 11 , b2=2,b3=6
Sonra
| 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) kaldırılır.
İle sonuna kadar(2,11),(4,6)=6∗17=102
Diğer yayılan ağaçlar
(11,2),(4,6)=15∗12=180
(2,11),(11,2)=13∗13=169