Diberikan grafik asiklik langsung , simpul adalah sumber jika indegree - nya adalah nol, artinya hanya memiliki busur keluar.
Apakah ada algoritma waktu linear untuk menemukan sumber dalam grafik asiklik langsung yang diberikan?
Pertanyaan tindak lanjut: Dapatkah seseorang dalam waktu linier menemukan semua sumber?
algorithms
graph-theory
breezeintopl
sumber
sumber
Jawaban:
Seperti yang Yuval katakan, struktur datanya penting di sini. Saya akan mencoba memberikan solusi untuk beberapa jenis daftar adjacency:
Sebagai catatan tambahan, jika memilih struktur data ada di tangan Anda, Anda mungkin ingin menganalisis semua operasi yang ingin Anda lakukan, dan seberapa sering, dan memilih struktur data yang sesuai.
Sunting: Untuk kasus 1, jika Anda memiliki dag di mana jumlah sumber sangat kecil dibandingkan dengan| V| (misalnya, dalam pohon dengan satu sumber), dan di mana jarak rata-rata dari titik mana pun ke sumber kecil dibandingkan dengan| V| dan Anda hanya menginginkan satu sumber saja, Anda dapat menggunakan algoritme rata-rata yang lebih cepat (meskipun kompleksitas asimptotik kasus terburuk akan sama). Pilih sembarang titik secara acak, dan buka salah satu induknya (dari daftar tepi yang masuk), dan terus ke induknya dan seterusnya, hingga Anda mencapai simpul yang tidak memiliki induk - sumber. Keuntungan kecil dari efisiensi ini adalah untuk jenis grafik yang sangat terbatas dengan algoritma yang sedikit lebih kompleks.
sumber
Mari kita pertimbangkan pertanyaan yang lebih sederhana. Misalkan Anda tahu grafik Anda adalah pohon. Kemudian Anda dapat menemukan simpul sumber dalam waktu linier. Cukup pilih simpul acak, jika itu adalah root maka Anda memiliki jawaban Anda, jika bukan itu haruslah anak atau orang tua lalu lintasi kembali hingga Anda mencapai root. Ini bisa dilakukan diO ( | V| -1) .
sumber
Dengan asumsi Anda memiliki grafik G = (V, E) yang diberikan dalam format daftar adjacency. (agar lebih jelas di sini daftar berisi semua tepi keluar dari sumber). Anda dapat membuat kebalikan dari grafik G dalam waktu linier. Kemudian Anda dapat mengulangi grafik terbalik dan mengumpulkan semua simpul yang memiliki daftar adjacency kosong. Verteks ini tidak memiliki tepi keluar dalam grafik terbalik yang berarti mereka tidak memiliki tepi masuk dalam grafik asli, oleh karena itu, ini adalah simpul sumber Anda.
Waktu berjalan adalah linear. Membangun terbalik grafik membutuhkan waktu maksimal O (| V | + | E |). Iterasi atas invers grafik membutuhkan waktu O (| V |).
sumber