Minimal Spanning Tree Dengan Parameter Berat Ganda

12

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 | .G(V,E)eAeBe(eTAe)(eTBe)|V|,|E|

Saya merasa kesulitan untuk mengadaptasi salah satu algoritma tradisional pada spanning tree (Kruskal, Prim, Edge-Deletion). Bagaimana cara mengatasinya? Ada petunjuk?

Strin
sumber
emax(Ae,Be)
3
Apakah ini masalah pekerjaan rumah? Jika demikian, apakah itu dari buku teks? Alasan saya bertanya adalah bahwa konteks dapat membantu "merekayasa balik" masalah. Tidak segera jelas bahwa algoritma serakah sesuai di sini, tetapi jika itu berasal dari bab tentang algoritma serakah ...
Joe
1
@utdiscant, itu tidak akan berhasil. Tepi negatif mungkin bermanfaat.
Nicholas Mancuso
bahkan untuk sisi positif tidak berguna, misalnya pasangan (10,10) tidak lebih baik daripada pasangan (11,1) dalam banyak kasus.

Jawaban:

1

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 hingga1n

Biarkan bobot A dari jumlah tepiaii

Biarkan bobot B dari nomor tepibii

Gambarkan tabel ini

   |a_1 a_2 a_3 a_4 .. a_n
---+-------------------------
b_1|.........................
b_2|.........................
 . |.........................
 . |.........................
b_n|...................a_n * b_n

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

(2,11),(11,2),(4,6) adalah tidak contoh counter.

a1=2,a2=11,a3=4

b1=11,b2=2,b3=6

Kemudian

   | 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) dihapus.

Berakhir dengan(2,11),(4,6)=617=102

Pohon merentang lainnya adalah

(11,2),(4,6)=1512=180

(2,11),(11,2)=1313=169

Herp Derpington
sumber
1
Menurut saya, ini adalah pendekatan yang agak serakah. Saya tidak yakin dengan "bukti" minimalis Anda.
Nejc
1
@ SaeedAmiri Bagaimana itu contoh counter? Saya memposting pekerjaan di bagian yang diedit, algoritma memberikan hasil yang benar.
Herp Derpington
1
Apa yang Anda lakukan adalah menemukan berapa banyak masing-masing berkontribusi dalam , dan Anda memilih yang paling berdampak. Itu bagus, tetapi bukan itu yang dibutuhkan. Ini pertanyaan yang sulit. Jika Anda ingin meningkatkan jawaban Anda, Anda harus datang dengan bukti. Kalau tidak, tidak ada gunanya. (ai,bi)eEai.eEbi
AJed
itu sangat tidak adil untuk mendapatkan suara untuk usaha Anda.
AJed
@AJed Buktinya sama seperti pada prim / kush / reverse delete. Yang harus kita buktikan sekarang adalah bahwa properti yang dipotong masih berlaku.
Herp Derpington
1

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 .xyxeTAeeTBexy

  1. 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 .ABA,BAxBy

  2. 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 .COABABxyCABC

Karena .2SABC=|AB×AC|=(BxAx,ByAy)×(CxAx,CyAy)=(BxAx)Cy+(AyBy)CxAy(BxAx)+Ax(ByAy)

  1. 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(BxAx)+Ax(ByAy(BxAx)Cy+(AyBy)CxG=(V,E)w(e)=Be(BxAx)+Cx(AyBy)GC

  2. Jalankan algoritma di atas pada rekursif, sampai tidak ada lagi yang mencakup pohon antara dan .OBC,OACBC,ACO

  3. Sekarang kita mendapatkan satu set pohon spanning yang mungkin. Hitung nilai untuk setiap pohon untuk mendapatkan pohon minimum.xy


sumber