Grafik Memiliki Dua / Tiga Pohon Minimal Spanning Berbeda?

15

Saya mencoba untuk menemukan metode yang efisien untuk mendeteksi apakah suatu grafik G memiliki dua pohon spanning minimal yang berbeda. Saya juga mencoba menemukan metode untuk memeriksa apakah ia memiliki 3 pohon spanning minimal yang berbeda. Solusi naif yang pernah saya pikirkan tentang menjalankan algoritma Kruskal sekali dan menemukan berat total pohon spanning minimal. Kemudian, menghapus tepi dari grafik dan menjalankan algoritma Kruskal lagi dan memeriksa apakah berat pohon baru adalah berat pohon spanning minimal asli, dan untuk masing-masing tepi dalam grafik. Runtime adalah O (| V || E | log | V |) yang tidak baik sama sekali, dan saya pikir ada cara yang lebih baik untuk melakukannya.

Setiap saran akan sangat membantu, terima kasih sebelumnya

itamar
sumber
Alangkah baiknya jika disadarkan dari algoritma seperti itu, tetapi itu tidak akan menyelesaikan masalah saat ini
itamar
2
Grafik akan memiliki pohon spanning minimum yang unik jika dan hanya jika (1) untuk setiap partisi V ( G ) menjadi dua himpunan bagian, tepi bobot minimum dengan satu titik akhir di setiap subset adalah unik, dan (2) bobot maksimum keunggulan dalam setiap siklus G adalah unik. GV(G)G
Juho
Apakah pertanyaan ini satu dan dua sudah menjawab pertanyaan Anda?
Juho
Lihat masalah 23-1 di CLRS untuk bagaimana menemukan MST terbaik kedua di . O(n2)
Kaveh

Jawaban:

7

Kapoor & Ramesh ( versi SIAM J. Comput. Yang tepat , versi situs web pribadi gratis (?) ) Memberikan algoritma untuk penghitungan semua pohon rentang minimum dalam grafik tertimbang dan tidak berbobot.

Pemahaman saya tentang ide dasar adalah bahwa Anda mulai dengan satu MST, kemudian bertukar tepi yang terletak di sepanjang siklus dalam grafik (jadi selama bobotnya baik-baik saja, Anda mengganti satu sisi dengan yang lain yang Anda tahu akan menghubungkan kembali pohon) .

Untuk case tertimbang mereka memberikan waktu berjalan untuk membuat daftar semua pohon rentang minimum mana N adalah jumlah pohon rentang tersebut. Ini menghitung mereka dalam urutan peningkatan berat, dan pemahaman saya saat ini (sepintas) menunjukkan bahwa itu layak untuk mengakhiri algoritma setelah telah menghasilkan sejumlah pohon (karena hanya dimulai dengan MST dan menghasilkan mereka secara berurutan).O(N|V|)N

Luke Mathieson
sumber
Dalam situasi ini di sini, kami ingin membatalkan algoritma lebih awal begitu kami tahu bahwa ada lebih dari solusi . Apakah algoritma memungkinkan untuk itu? k
Raphael
1
@ Raphael, saya belum punya waktu untuk benar-benar mengatasinya (penandaan tugas yay), tetapi dari pemahaman kasar saya, itu harus mungkin - dimulai dengan beberapa MST, kemudian menghasilkan yang lain satu per satu dari itu.
Luke Mathieson
1
@SaeedAmiri: "Jumlah pohon yang merentang seperti itu " berarti "jumlah pohon yang merentang minimum ", bukan "jumlah pohon yang merentang". Jika semua spanning tree adalah minimum spanning tree, maka grafik input lengkap dan semua sisi memiliki bobot yang sama. nn2
JeffE
1
O(|V|)
1
Setelah membaca cepat, algoritma berbobot menghasilkan pohon dalam urutan peningkatan berat (mulai dari MST jelas). Jadi seharusnya untuk tujuan OP.
Luke Mathieson
2

Satu dapat menunjukkan bahwa algoritma Kruskal dapat menemukan setiap pohon spanning minimal; lihat di sini .

kk

Raphael
sumber
5
kkK1,5
@vonbrand Poin bagus. Kita dapat melanjutkan untuk menyelesaikan semua cabang perhitungan, tentu saja, tetapi kemudian runtime ditentukan oleh jumlah spanning tree, yang mungkin eksponensial.
Raphael
1

Untuk melihat apakah ada lebih dari satu MST, pertimbangkan misalnya algoritma Kruskal. Satu-satunya cara ia bisa membangun MST yang berbeda adalah dengan meninggalkan tepi dengan memilih yang lain ketika ada beberapa dengan berat yang sama. Tapi ujung-ujung yang sama-beratnya mungkin telah dikesampingkan karena mereka membentuk siklus dengan tepi yang lebih ringan ...

Jadi Anda harus menjalankan algoritma Kruskal, dan ketika ada beberapa sisi dengan bobot yang sama untuk dipertimbangkan, tambahkan semuanya yang dapat ditambahkan tanpa membuat siklus. Jika ada tepi dari bobot ini yang tersisa, dan itu tidak menutup siklus dengan salah satu tepi dengan bobot lebih rendah (yang ditambahkan sebelumnya), ada lebih dari satu MST. Memeriksa apakah ada tepat 2 atau 3 atau lebih, dll terlihat jauh lebih sulit ...

vonbrand
sumber
0

Memodifikasi algoritma Kruskal: Sambil memesan tepi, tepi cluster dengan bobot yang sama. Sekarang, pada titik di mana Anda memproses tepi secara berurutan, setiap kali Anda mencapai sebuah kluster baru, pertama-tama periksa semua tepian secara terpisah dan hapus dari klaster yang akan menutup siklus, mengingat apa yang dibangun sebelum kluster. Kemudian jalankan semua tepi yang tersisa di cluster sekarang mencoba menambahkannya ke MST. Jika salah satu dari mereka menutup siklus, maka itu tentu karena tepi lain dari cluster yang sama dimasukkan sebelumnya, yang berarti bahwa Anda memiliki lebih dari satu MST.

Solusi itu menjaga kompleksitas algoritma Kruskal, hanya saja meningkatkan waktu untuk setiap sisi yang diproses.

Carlos A. Prolo
sumber
Anda tampaknya mengklaim bahwa Anda dapat memproses seluruh cluster dalam waktu konstan tetapi saya tidak melihat adanya konstanta yang jelas pada ukuran sebuah cluster. Bisakah Anda memberikan detail lebih lanjut tentang bagaimana tahap itu dilakukan?
David Richerby