Pertimbangkan grafik terarah. Kami memanggil superstar simpul jika dan hanya jika tidak ada simpul lain yang dapat dijangkau darinya, tetapi semua simpul lainnya memiliki keunggulan terhadap v . Secara formal:
v
dengan jumlah node dalam grafik. Misalnya, dalam grafik di bawah ini, node yang tidak terisi adalah superstar (dan node lainnya tidak).
[ sumber ]
Bagaimana Anda bisa mengidentifikasi semua bintang dalam grafik terarah dalam waktu ? Representasi grafik yang sesuai dapat dipilih dari kandidat biasa ; tolong jangan menggunakan representasi yang memindahkan kompleksitas masalah ke preproses.
Tidak ada asumsi tentang kepadatan yang dapat dibuat. Kami tidak menganggap grafik berisi superstar; jika tidak ada, algoritma harus mengenalinya.
Notasi : adalah jumlah node tepi keluar, sama untuk tepi yang masuk.
sumber
Jawaban:
Kita dapat menghilangkan semua kecuali satu dari simpul dengan memeriksa keberadaan edge karena kita dapat menghilangkan satu kemungkinan untuk setiap edge yang kita periksa. Secara khusus, jika ada sisi bergerak dari x ke y , kita menghilangkan x dan beralih ke y (karena titik lain dapat dicapai darinya); jika tidak, kita hilangkan y (karena tidak dapat dicapai dari x ). Setelah kami mencapai simpul terakhir, simpul mana pun yang tidak dihilangkan harus dibandingkan satu sama lain (pastikan kondisi superstar ditegakkan: ada tepi masuk tetapi tidak keluar) sampai dihapus atau dikonfirmasi sebagai superstar. Beberapa pseudocode:n−1 x y x y y x
Mari kita telusuri contoh untuk menggambarkan metode ini. Ambil array ini, dengan simpul sumber di atas dan tujuan di samping. 1 menunjukkan tepi:
Saya akan menghapus simpul yang telah kita singkirkan sebagai superstar potensial. Saya akan menggunakan hijau dan merah untuk menunjukkan tepi yang kita lihat ketika mereka lakukan dan tidak mengandung tepi yang kita cari, dan biru untuk menunjukkan di mana kita sudah melihat.
Kita mulai dengan melihat simpul 1 dan 2.
Angka hijau menunjukkan ada tepi dari 2 ke 1, jadi kami menghilangkan 2 dan mencari tepi dari 3 ke 1 :
Kami melihat tidak ada tepi seperti itu, jadi kami menghilangkan 1 dan mengambil 3 sebagai simpul kami saat ini. Ingatlah bahwa kami telah menghilangkan 2, jadi lihat apakah ada keunggulan dari 4 hingga 3:
Ada tepi dari 4 hingga 3, jadi kami menghilangkan 4. Pada titik ini kami telah menghilangkan semua kecuali satu dari simpul (3), jadi periksa ujungnya dan lihat apakah memenuhi syarat:
Ada keunggulan dari 1 ke 3 tapi bukan sebaliknya, jadi 3 masih kandidat.
Ada juga keunggulan dari 2 ke 3 tetapi bukan sebaliknya, jadi 3 masih kandidat.
Ada keunggulan dari 4 ke 3 tetapi tidak 3 ke 4; yang melengkapi pemeriksaan 3 sisi kami dan kami telah menemukan bahwa itu sebenarnya adalah seorang superstar.
sumber
Bukankah ini Masalah Selebriti ?
Hanya akan ada satu superstar (selebriti) jika ada.
Menyimpan daftar kandidat saat ini, menghilangkan satu per satu. Daftar tertaut harus cukup.
Pada akhirnya, Anda dapat memverifikasi apakah kandidat Anda memang seorang superstar.
sumber
Jawaban ini membahas versi pertanyaan di mana representasi grafik dimungkinkan, bukan versi pertanyaan saat ini.
Simpan grafik Anda sebagai pasangan daftar adjacency dan membalikkan daftar adjacency, di mana masing-masing daftar berisi tambahan panjang daftar, sehingga jumlah masing-masing out-and in-edge.
sumber
Hanya untuk referensi, ini adalah pseudocode dari versi rekursif dari apa yang diposting Kevin.
sumber