Pertimbangkan grafik . Setiap tepi e memiliki dua bobot A e dan B e . Cari pohon rentang yang meminimalkan produk ( Σ e ∈ T A e ) ( Σ e ∈ T B e ) . Algoritme harus dijalankan dalam waktu polinomial berkenaan dengan | V | , | E | .
Saya merasa kesulitan untuk mengadaptasi salah satu algoritma tradisional pada spanning tree (Kruskal, Prim, Edge-Deletion). Bagaimana cara mengatasinya? Ada petunjuk?
Jawaban:
Saya akan menganggap Anda tidak diberi tepi berbobot negatif, karena ini mungkin tidak berfungsi jika ada bobot negatif.
Algoritma
Untuk setiap sisi Anda, beri label hingga1 n
Biarkan bobot A dari jumlah tepiai i
Biarkan bobot B dari nomor tepibi i
Gambarkan tabel ini
Dengan masing-masing elemen tabel menjadi produk baris dan kolom.
Untuk setiap tepi, jumlah baris dan kolom tabel yang relevan (dan ingat untuk menghapus elemen di persimpangan karena telah dijumlahkan dua kali).
Temukan tepi yang memiliki jumlah terbesar, hapus tepi ini jika tidak memutuskan grafik. Tandai tepi sebagai esensial jika tidak. Jika tepi telah dihapus, isi baris dan kolomnya dengan 0.
Ketepatan
Hasilnya jelas pohon.
Hasilnya jelas mencakup karena tidak ada simpul yang terputus.
Hasilnya minimal? Jika ada tepi lain yang penghapusannya akan membuat spanning tree yang lebih kecil di akhir algoritma, maka tepi itu akan dihapus dan dibatalkan terlebih dahulu. (Jika seseorang dapat membantu saya membuat ini sedikit lebih teliti / dan / atau contoh balasan maka itu akan bagus)
Runtime
Jelas polinomial dalam.|V|
sunting
Kemudian
Berakhir dengan(2,11),(4,6)=6∗17=102
Pohon merentang lainnya adalah
sumber
Ini adalah solusi dari http://www.cnblogs.com/autsky-jadek/p/3959446.html .
Kita dapat melihat setiap spanning tree sebagai titik di bidang , di mana adalah jumlah berat , y adalah jumlah berat . Tujuannya untuk meminimalkan .x−y x ∑e∈TAe ∑e∈TBe xy
Menemukan minimum spanning tree sesuai dengan berat dan berat . Jadi kita memiliki dua poin dalam bidang xy . Di semua titik spanning tree dalam pesawat, memiliki minimum , memiliki minimum .A B A,B A x B y
Sekarang kita bertujuan untuk menemukan titik dalam segitiga yang memiliki jarak maksimum ke garis , sehingga kita dapat memiliki nilai untuk diperkecil untuk semua titik dalam segitiga .C OAB AB xy C ABC
Karena .2SABC=|AB−→−×AC−→−|=(Bx−Ax,By−Ay)×(Cx−Ax,Cy−Ay)=(Bx−Ax)⋅Cy+(Ay−By)⋅Cx−Ay(Bx−Ax)+Ax(By−Ay)
Perhatikan bahwa adalah konstanta, jadi sekarang kami bertujuan untuk memaksimalkan . Jadi kita membuat grafik baru , sedangkan bobot . Sekarang kita menjalankan spanning tree maksimum pada untuk mendapatkan titik .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
Jalankan algoritma di atas pada rekursif, sampai tidak ada lagi yang mencakup pohon antara dan .OBC,OAC BC,AC O
Sekarang kita mendapatkan satu set pohon spanning yang mungkin. Hitung nilai untuk setiap pohon untuk mendapatkan pohon minimum.xy
sumber