Ini adalah pseudocode standar untuk pencarian pertama luasnya:
{ seen(x) is false for all x at this point }
push(q, x0)
seen(x0) := true
while (!empty(q))
x := pop(q)
visit(x)
for each y reachable from x by one edge
if not seen(y)
push(q, y)
seen(y) := true
Di sini push
dan pop
dianggap sebagai operasi antrian. Tetapi bagaimana jika mereka adalah operasi stack? Apakah algoritma yang dihasilkan mengunjungi simpul dalam urutan pertama?
Jika Anda memilih komentar "ini sepele", saya akan meminta Anda untuk menjelaskan mengapa itu sepele. Saya menemukan masalahnya cukup rumit.
algorithms
graphs
rgrig
sumber
sumber
pop
ke stack atau operasi antrian, kita mendapatkan dfs atau bfs. Juga mudah untuk menulis pseudo-code yang pertama kali muncul bahwa ini benar, tetapi tidak. ics.uci.edu//~eppstein/161/960215.html adalah referensi yang relevan.Jawaban:
Tidak, ini tidak sama dengan DFS.
Perhatikan grafiknya
Jika Anda mendorong node dalam urutan kanan ke kiri, algoritma memberi Anda traversal:
sementara DFS akan mengharapkannya
Masalah terjadi karena Anda menandainya seperti yang terlihat pada saat mendorong, bukan pada saat berkunjung. Seperti yang ditunjukkan dalam komentar, jika Anda menandai pada saat berkunjung, persyaratan ruang Anda mungkin naik ke daripada .O ( V )Θ ( V+ E) O (V)
Saya setuju, masalahnya tidak sepele.
sumber