Saya memiliki pohon tidak berarah yang simpulnya ingin saya beri label. Node daun harus diberi label satu. Lalu, anggap daunnya sudah dibuang. Di pohon yang tersisa, daunnya harus diberi label dua. Proses ini berlanjut dengan cara yang jelas sampai semua simpul memiliki label. Alasan saya melakukan ini adalah saya ingin menyimpan simpul dalam antrian, dan pergi melalui mereka "pergi dulu". Apakah ada cara mudah untuk melakukan ini waktu?
Saya dapat memecahkan masalah dengan melakukan BFS di setiap langkah. Tetapi dalam kasus terburuk, pada setiap langkah saya melalui setiap titik, menghapus tepat dua daun dan enqueue mereka. Saya percaya ini membutuhkan waktu kuadratik.
Gagasan lain adalah pertama-tama menemukan semua daun, dan kemudian melakukan BFS dari setiap daun. Ini tidak memberi saya solusi yang diinginkan. Misalnya, perhatikan semacam "grafik mahkota" seperti pada gambar di bawah ini. Solusi yang diinginkan ditampilkan, tetapi meluncurkan BFS dari masing-masing daun akan menghasilkan hanya dua label yang digunakan.
Idealnya, algoritma waktu linear juga mudah dijelaskan dan diimplementasikan.
sumber
Jawaban langsung adalah sebagai berikut:
Ubah ini menjadi grafik terarah, di mana kita memiliki edge dari setiap node ke induknya . Perhatikan bahwa Anda mendapatkan dag (grafik asiklik langsung).u v(u,v) u v
Urutkan grafik secara topologis.
Pindai simpul, dalam urutan terurut. Labeli setiap titik dengan satu lebih dari label terbesar pada pendahulunya. Karena kita memindai dalam urutan topologis, semua pendahulu akan sudah menerima label sebelum kita mencoba memberi label .vv v
Setiap langkah ini dapat dilakukan dalam waktu , sehingga total waktu berjalan adalah . Saya menyebutkan pendekatan alternatif ini hanya jika Anda merasa secara konsepsi lebih mudah dipahami daripada jawaban Yuval.O ( n + m )O(n+m) O(n+m)
sumber