Algoritma untuk menemukan diameter pohon menggunakan BFS / DFS. Mengapa ini berhasil?


28

Tautan ini menyediakan algoritme untuk menemukan diameter pohon tak berarah menggunakan BFS / DFS . Meringkas:

Jalankan BFS pada sembarang simpul dalam grafik, mengingat simpul yang Anda temukan terakhir. Jalankan BFS dari Anda mengingat simpul v yang ditemukan terakhir. d (u, v) adalah diameter pohon.

Mengapa ini berhasil?

Halaman 2 dari ini memberikan alasan, tetapi membingungkan. Saya mengutip bagian awal dari bukti:

Jalankan BFS pada sembarang simpul dalam grafik, mengingat simpul yang Anda temukan terakhir. Jalankan BFS dari Anda mengingat simpul v yang ditemukan terakhir. d (u, v) adalah diameter pohon.

Kebenaran: Biarkan a dan b berupa dua simpul sehingga d (a, b) adalah diameter pohon. Ada jalur unik dari a ke b. Biarkan t menjadi simpul pertama di jalur itu yang ditemukan oleh BFS. Jika jalur p1 dari s ke u dan p2 dari a ke b tidak berbagi tepi, maka jalur dari t ke u termasuk s. Begitu

d(t,u)d(s,u)

d(t,u)d(s,a)

.... (lebih banyak ketidaksetaraan mengikuti ..)

Ketidaksamaan tidak masuk akal bagi saya.


Saya tidak menemukan kutipan dalam pertanyaan terkait.
Raphael

1
Coba ganti "jangan bagikan tepi" dengan "jangan bagikan simpul" dalam solusi.
Yuval Filmus

Anda hanya menggunakan BFS, bukan DFS.
Thumbnail

Jawaban:


11

Semua bagian dari pembuktian klaim bergantung pada 2 sifat penting pohon dengan tepi yang tidak terarah:

  • 1-connectedness (mis. Antara 2 node di pohon ada persis satu jalur)
  • simpul apa pun dapat berfungsi sebagai akar dari pohon.

Pilih simpul pohon sembarang . Asumsikan u , v V ( G ) adalah simpul dengan d ( u , v ) = d i a m ( G ) . Asumsikan lebih lanjut bahwa algoritma menemukan sebuah simpul x mulai dari pertama, beberapa simpul y mulai dari x berikutnya. wlog d ( s , u ) d ( s , v ) . perhatikan itusu,vV(G)d(u,v)=diam(G)xsyxd(s,u)d(s,v) harus dimiliki, kecuali tahap pertama algoritma tidak akan berakhir pada x . Kita akan melihat bahwa d ( x , y ) = d ( u , v ) .d(s,x)d(s,y)xd(x,y)=d(u,v)

Konfigurasi yang paling umum dari semua node yang terlibat dapat dilihat pada pseudo-grafis berikut (mungkin atau s = z x y atau keduanya):s=zuvs=zxy

(u)                                            (x)
  \                                            /
   \                                          /
    \                                        /
     ( z_uv )---------( s )----------( z_xy )
    /                                        \
   /                                          \
  /                                            \
(v)                                            (y)

kami tahu bahwa:

  1. . jika tidak d ( u , v ) < d i a m ( G ) yang bertentangan dengan asumsi.d(zuv,y)d(zuv,v)d(u,v)<diam(G)
  2. . jika tidak d ( u , v ) < d i a m ( G ) yang bertentangan dengan asumsi.d(zuv,x)d(zuv,u)d(u,v)<diam(G)
  3. , jika tidak, tahap 1 dari algoritma tidak akan berhenti di x .d(s,zxy)+d(zxy,x)d(s,zuv)+d(zuv,u)x
  4. , jika tidak, tahap 2 dari algoritma tidak akan berhenti pada y .d(zxy,y)d(v,zuv)+d(zuv,zxy)y

1) dan 2) menyiratkan .d(u,v)=d(zuv,v)+d(zuv,u)d(zuv,x)+d(zuv,y)=d(x,y)+2d(zuv,zxy)d(x,y)

3) dan 4) menyiratkan d(zxy,y)+d(s,zxy)+d(zxy,x)d(s,zuv)+d(zuv,u)+d(v,zuv)+d(zuv,zxy) setara dengan .d(x,y)=d(zxy,y)+d(zxy,x)2d(s,zuv)+d(v,zuv)+d(u,zuv)d(u,v)

oleh karena itu .d(u,v)=d(x,y)

bukti analog berlaku untuk konfigurasi alternatif

                 (u)                          (x)
                   \                          /
                    \                        /
                     \                      /
     ( s )---------( z_uv )----------( z_xy )
                     /                      \
                    /                        \
                   /                          \
                 (v)                          (y)

dan

                          (x)        (u)  
                          /            \  
                         /              \ 
                        /                \
     ( s )---------( z_xy )----------( z_uv )
                        \                /          
                         \              /           
                          \            /            
                          (y)        (v)            

ini semua kemungkinan konfigurasi. khususnya, karena hasil tahap 1 dari algoritma dan y p a t h ( x , u ) , y p a t h ( x , v ) karena tahap 2.xpath(s,u),xpath(s,v)ypath(x,u),ypath(x,v)


(1) Mengenai grafik pertama, bukankah jalan dari s ke x selalu mengandung simpul u dan v dalam beberapa urutan karena ada pada pohon yang dihasilkan oleh BFS? (2) Bisakah Anda mengklarifikasi bagaimana ketidaksetaraan diperoleh? (3) Karena BFS dimulai dari s dan yang dimulai dari x mengandung u, v di suatu tempat di jalan, saya percaya grafik harus seperti yang ditunjukkan pada tautan imgur.com/jQ94erY . Bagaimana alasan yang Anda berikan berlaku di sini?
curryage

@curryage perhatikan bahwa pohon itu diberikan dan tidak sedang dibangun oleh bfs! jawaban spesifik: iklan 1) no. bayangkan penyempurnaan pohon dalam grafik (1) dengan menambahkan banyak node di tepi dan tepat 1 simpul di tepi ( z x y , x ) . bfs tahap pertama akan berakhir di x. iklan 2) ketidaksetaraan mana yang tidak jelas? kami selalu mengasumsikan bahwa ( u , v ) menjadi jalur panjang diameter grafik d i a g ( G )(s,zxy)(zxy,x)(u,v)diag(G). ini didefinisikan dengan baik karena G terhubung dengan 1. iklan 3) no: 3.1 ada lebih dari 1 jalur antara 2 node selain , jadi grafiknya bukan pohon. ...(s,y)
collapsar

@curryage ... 3,2 ; ini tidak mungkin karena d ( u , v ) = d i a m ( G ) dengan asumsi dan diameter grafik adalah jarak minimum maksimal antara dua node. dalam kasus pohon ada tepat 1 jalur antara setiap 2 node, sehingga definisi berkurang menjadi 'jarak maksimum antara setiap dua node'. d(x,y)>d(u,v)d(u,v)=diam(G)
collapsar

9

Intuisi di belakang sangat mudah dipahami. Misalkan saya harus menemukan jalur terpanjang yang ada di antara dua node di pohon yang diberikan.

Setelah menggambar beberapa diagram kita dapat mengamati bahwa jalur terpanjang akan selalu terjadi antara dua node daun (node ​​hanya memiliki satu sisi yang terhubung). Ini juga dapat dibuktikan dengan kontradiksi bahwa jika jalur terpanjang antara dua node dan salah satu atau keduanya bukan node daun maka kita dapat memperluas jalur untuk mendapatkan jalur yang lebih panjang.

Jadi salah satu caranya adalah dengan memeriksa dulu apa itu daun, lalu mulai BFS dari salah satu simpul daun untuk mendapatkan simpul yang paling jauh darinya.

Alih-alih pertama-tama menemukan node mana yang merupakan node daun, kita memulai BFS dari node acak dan kemudian melihat node mana yang paling jauh darinya. Biarkan node terjauh menjadi x. Jelas bahwa x adalah simpul daun. Sekarang jika kita memulai BFS dari x dan memeriksa node terjauh darinya, kita akan mendapatkan jawaban kita.

Tapi apa jaminan bahwa x akan menjadi titik akhir dari jalur maksimum?

Mari kita lihat dengan sebuah contoh: -

       1   
    / /\ \
   6 2  4 8
         \ \
          5 9
           \
            7

Misalkan saya memulai BFS saya dari 6. Node pada jarak maksimum dari 6 adalah node 7. Menggunakan BFS kita bisa mendapatkan node ini. Sekarang kita beri bintang BFS dari node 7 untuk mendapatkan node 9 pada jarak maksimum. Jalur dari simpul 7 ke simpul 9 jelas merupakan jalur terpanjang.

Bagaimana jika BFS yang dimulai dari node 6 memberi 2 sebagai node pada jarak maksimum. Kemudian ketika kita akan BFS dari 2 kita akan mendapatkan 7 sebagai simpul pada jarak maksimum dan jalur terpanjang akan menjadi 2-> 1-> 4-> 5-> 7 dengan panjang 4. Tetapi panjang jalur terpanjang sebenarnya adalah 5. Ini tidak bisa terjadi karena BFS dari node 6 tidak akan pernah memberikan simpul 2 sebagai simpul pada jarak maksimum.

Semoga itu bisa membantu.


1
itu penjelasan yang sederhana & jelas! terima kasih :)
anekix

4

Berikut ini adalah bukti yang mengikuti rangkaian solusi MIT yang tertaut dalam pertanyaan awal dengan lebih dekat. Untuk lebih jelasnya, saya akan menggunakan notasi yang sama yang mereka gunakan sehingga perbandingan bisa lebih mudah dibuat.

ababp(a,b)d(a,b)sa,bs=abud(s,u)=maxxd(s,x)

Lemma 0: Baik dan adalah simpul daun.ab

Bukti: Jika mereka bukan simpul daun, kita bisa meningkatkan dengan memperluas titik akhir ke simpul daun, bertentangan dengan menjadi diameter.d(a,b)d(a,b)

Lemma 1: .max[d(s,a),d(s,b)]=d(s,u)

Bukti: Misalkan demi kontradiksi bahwa baik dan benar-benar kurang dari . Kami melihat dua kasus:d(s,a)d(s,b)d(s,u)

Kasus 1: path tidak tidak mengandung simpul . Dalam hal ini, tidak boleh diameter. Untuk melihat alasannya, mari menjadi simpul unik pada dengan jarak terkecil ke . Kemudian, kita melihat bahwa , karena . Demikian pula, kita juga akan memiliki . Ini bertentangan dengan menjadi diameter.p(a,b)sd(a,b)tp(a,b)sd(a,u)=d(a,t)+d(t,s)+d(s,u)>d(a,b)=d(a,t)+d(t,b)d(s,u)>d(s,b)=d(s,t)+d(t,b)>d(t,b)d(b,u)>d(a,b)d(a,b)

Kasus 2: jalur berisi simpul . Dalam hal ini, lagi tidak bisa menjadi diameter, karena untuk beberapa simpul sedemikian sehingga , keduanya dan akan lebih besar dari .p(a,b)sd(a,b) ud(s,u)=maxxd(s,x)d(a,u)d(b,u)d(a,b)

Lemma 1 memberikan alasan mengapa kita memulai pencarian Breadth-First kedua pada titik terakhir yang ditemukan dari BFS pertama. Jika adalah simpul unik dengan jarak kemungkinan terbesar dari , maka oleh Lemma 1, itu harus menjadi salah satu titik akhir dari beberapa lintasan dengan jarak yang sama dengan diameter, dan karenanya BFS kedua dengan sebagai root dengan jelas menemukan diameter. Di sisi lain, jika ada setidaknya satu simpul lain sehingga , maka kita tahu bahwa diameternya adalah , dan tidak masalah apakah kita memulai BFS kedua di atau .u s u v d ( s , v ) = d ( s , u ) d ( a , b ) = 2 d ( s , u ) u vuusuvd(s,v)=d(s,u)d(a,b)=2d(s,u)uv


Luar biasa. Terima kasih telah mengirim jawaban ini. Saya terkejut bahwa jawaban ini tidak menerima upvotes.
Zephyr

0

Pertama-tama jalankan DFS dari simpul acak kemudian diameter pohon adalah jalur antara daun terdalam dari simpul dalam subtree DFS-nya: masukkan deskripsi gambar di sini


4
Mengapa ini bekerja?
Yuval Filmus

0

Dengan definisi BFS, jarak (dari node awal) dari setiap node yang dieksplorasi sama dengan jarak dari node sebelumnya yang dieksplorasi atau lebih besar dengan 1. Dengan demikian, node terakhir yang dieksplorasi oleh BFS akan berada di antara mereka yang paling jauh dari awal. simpul

xaxxbaa


1
Terima kasih atas jawabannya dengan intuisi. Namun, "demikian" dalam kalimat terakhir Anda tidak jelas. Mengapa itu terjadi? Mengapa node terjauh dari harus menjadi salah satu dari dua node pada jarak maksimum satu sama lain? Sepertinya itu perlu bukti. x
DW

Saya tidak yakin bagaimana membuat bukti seperti itu. Saya merasa sebaliknya adalah benar secara intuitif: jika dua node berada pada jarak maksimum satu sama lain, maka, untuk setiap node yang diberikan, salah satu dari keduanya berada pada jarak yang paling jauh darinya.
Extrarius

Klaim "benar secara intuitif" tidak benar secara umum untuk grafik umum. Lihat grafik di cs.stackexchange.com/a/213/755 , dan bayangkan memulai BFS dari node (yaitu, misalkan ); maka ia akan memilih dan menemukan node pada jarak terbesar dari , tetapi itu tidak menemukan dua node jarak maksimum dari satu sama lain. Jadi pernyataan yang diklaim, jika benar, harus bergantung pada beberapa properti khusus pohon yang tidak berlaku untuk grafik umum. x = v a = u b avx=va=uba
DW

Ya, tetapi pertanyaan ini menentukan pohon yang tidak diarahkan, yang merupakan konteks yang saya maksudkan. Batasan siklus dan tepi terarah membuat banyak masalah grafik secara signifikan lebih mudah untuk dipikirkan.
Extrarius

0

Satu hal utama yang perlu diketahui adalah bahwa pohon selalu planar, yang berarti dapat diletakkan di atas pesawat, sehingga sering kali pemikiran 2 dimensi biasa bekerja. Dalam hal ini, algoritma mengatakan mulai dari mana saja, pergi sejauh yang Anda bisa. Jarak dari titik itu sejauh yang bisa Anda dapatkan dari titik itu adalah jarak terpanjang di pohon, dan karenanya diameternya.

Metode ini juga akan berfungsi untuk menemukan diameter pulau fisik yang nyata jika kita mendefinisikannya sebagai diameter lingkaran terkecil yang akan sepenuhnya menutupi pulau.


0

@OP, cara kasus didefinisikan dalam PDF mungkin agak tidak aktif.

Saya pikir dua kasus itu seharusnya:

  1. p1 tidak berpotongan dengan , yaitu tidak ada simpul umum antara jalur dan . Dalam hal ini, tentukan sebagai simpul pertama pada ditemukan oleh BFS pertama dimulai dari .p2p1p2tp2s

  2. p1 dan memiliki setidaknya satu simpul umum. Dalam hal ini, tentukan untuk menjadi simpul pertama pada ditemukan oleh BFS pertama yang juga ada di .p2tp2p1

Buktinya dalam PDF harus mengikuti.

Dengan definisi ini, angka yang ditunjukkan oleh OP termasuk dalam Kasus 2.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.