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
Jawaban:
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
sumber
Satu dapat menunjukkan bahwa algoritma Kruskal dapat menemukan setiap pohon spanning minimal; lihat di sini .
sumber
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 ...
sumber
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.
sumber