Thuật toán tìm đường kính của cây bằng BFS / DFS. Tại sao nó hoạt động?


28

Liên kết này cung cấp một thuật toán để tìm đường kính của một cây vô hướng bằng BFS / DFS . Tóm tắt:

Chạy BFS trên bất kỳ nút nào trong biểu đồ, ghi nhớ nút u được phát hiện lần cuối. Chạy BFS từ u nhớ nút v được phát hiện lần cuối. d (u, v) là đường kính của cây.

Tại sao nó hoạt động?

Trang 2 này cung cấp một lý do, nhưng nó gây nhầm lẫn. Tôi đang trích dẫn phần đầu của bằng chứng:

Chạy BFS trên bất kỳ nút nào trong biểu đồ, ghi nhớ nút u được phát hiện lần cuối. Chạy BFS từ u nhớ nút v được phát hiện lần cuối. d (u, v) là đường kính của cây.

Tính chính xác: Đặt a và b là hai nút bất kỳ sao cho d (a, b) là đường kính của cây. Có một con đường duy nhất từ ​​a đến b. Đặt t là nút đầu tiên trên đường dẫn được phát hiện bởi BFS. Nếu các đường dẫn từ s đến u và từ a đến b không chia sẻ các cạnh, thì đường dẫn từ t đến u bao gồm s. Vì thếp1p2

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

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

.... (nhiều bất bình đẳng theo sau ..)

Sự bất bình đẳng không có ý nghĩa với tôi.


Tôi không tìm thấy trích dẫn trong câu hỏi liên kết.
Raphael

1
Hãy thử thay thế "không chia sẻ các cạnh" bằng "không chia sẻ các đỉnh" trong giải pháp.
Yuval Filmus

Bạn chỉ sử dụng BFS, không phải DFS.
Hình thu nhỏ

Câu trả lời:


11

Tất cả các phần của việc chứng minh bản lề yêu cầu trên 2 thuộc tính quan trọng của cây với các cạnh không bị ngăn cản:

  • Kết nối 1 (nghĩa là giữa 2 nút bất kỳ trong một cây có chính xác một đường dẫn)
  • bất kỳ nút nào cũng có thể đóng vai trò là gốc của cây.

Chọn một nút cây tùy ý . Giả sử là các nút có . Giả sử thêm rằng thuật toán tìm thấy một nút bắt đầu từ trước, một số nút bắt đầu từ tiếp theo. wlog . lưu ý rằng phải giữ, trừ khi giai đoạn đầu tiên của thuật toán sẽ không kết thúc tại . Chúng ta sẽ thấy rằng .u , v V ( G ) d ( u , v ) = d i a m ( G ) x s y x d ( s , u ) d ( s , v ) d ( s , x ) d ( s , y ) x d ( x , y ) =su,vV(G)d(u,v)=diam(G)xsyxd(s,u)d(s,v)d(s,x)d(s,y)xd(x,y)=d(u,v)

Cấu hình chung nhất của tất cả các nút liên quan có thể được nhìn thấy trong đồ họa giả sau (có thể hoặc hoặc cả hai): s = z x ys=zuvs=zxy

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

Chúng ta biết rằng:

  1. d ( u , v ) < d i a m ( G )d(zuv,y)d(zuv,v) . mặt khác mâu thuẫn với giả định.d(u,v)<diam(G)
  2. d ( u , v ) < d i a m ( G )d(zuv,x)d(zuv,u) . mặt khác mâu thuẫn với giả định.d(u,v)<diam(G)
  3. xd(s,zxy)+d(zxy,x)d(s,zuv)+d(zuv,u) , nếu không thì giai đoạn 1 của thuật toán sẽ không đã dừng lại ở .x
  4. yd(zxy,y)d(v,zuv)+d(zuv,zxy) , nếu không, giai đoạn 2 của thuật toán sẽ không dừng lại ở .y

1) và 2) ngụ ý .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) và 4) ngụ ý tương đương đến .d(zxy,y)+d(s,zxy)+d(zxy,x)d(s,zuv)+d(zuv,u)+d(v,zuv)+d(zuv,zxy)d(x,y)=d(zxy,y)+d(zxy,x)2d(s,zuv)+d(v,zuv)+d(u,zuv)d(u,v)

do đó .d(u,v)=d(x,y)

bằng chứng tương tự giữ cho các cấu hình thay thế

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

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

đây là tất cả các cấu hình có thể cụ thể, do kết quả của giai đoạn 1 của thuật toán và do giai đoạn 2.y p a t h ( x , u ) , y p a t h ( x , v )xpath(s,u),xpath(s,v)ypath(x,u),ypath(x,v)


(1) Về đồ họa đầu tiên, không phải đường dẫn từ s đến x luôn chứa các đỉnh u và v theo thứ tự nào đó vì chúng có mặt trên cây do BFS tạo ra? (2) Bạn có thể làm rõ làm thế nào bất bình đẳng thu được? (3) Vì BFS bắt đầu từ s và bắt đầu từ x chứa u, v ở đâu đó trên đường dẫn, tôi tin rằng đồ họa phải được hiển thị trong liên kết imgur.com/jQ94erY . Làm thế nào để lý do bạn cung cấp áp dụng ở đây?
cà ri

@curryage lưu ý rằng cây được đưa ra và không được xây dựng bởi bfs! câu trả lời cụ thể: quảng cáo 1) không. hãy tưởng tượng một sự tinh chỉnh của cây trong đồ họa (1) bằng cách thêm tùy ý nhiều nút trên cạnh và chính xác 1 nút trên cạnh . bfs giai đoạn đầu tiên sau đó sẽ kết thúc tại x. quảng cáo 2) bất bình đẳng / ies nào không rõ ràng? chúng ta luôn giả sử rằng là một đường dẫn có độ dài đường kính của đồ thị . điều này được xác định rõ vì G được kết nối 1. quảng cáo 3) không: 3.1 có nhiều hơn 1 đường dẫn giữa 2 nút bất kỳ ngoài , vì vậy biểu đồ không phải là một cây. ...( z x y , x ) ( u , v ) d i a g ( G ) ( s , y )(s,zxy)(zxy,x)(u,v)diag(G)(s,y)
sụp đổ

@curryage ... 3,2 ; điều này là không thể vì theo giả định và đường kính của đồ thị là khoảng cách tối thiểu tối đa giữa hai nút bất kỳ. trong trường hợp cây có chính xác 1 đường dẫn giữa 2 nút bất kỳ, do đó định nghĩa sẽ giảm xuống 'khoảng cách tối đa giữa hai nút bất kỳ'. d ( u , v ) = d i a m ( G )d(x,y)>d(u,v)d(u,v)=diam(G)
sụp đổ

9

Trực giác đằng sau là rất dễ hiểu. Giả sử tôi phải tìm đường dẫn dài nhất tồn tại giữa hai nút bất kỳ trong cây đã cho.

Sau khi vẽ một số sơ đồ, chúng ta có thể quan sát rằng đường dẫn dài nhất sẽ luôn xảy ra giữa hai nút lá (các nút chỉ có một cạnh được liên kết). Điều này cũng có thể được chứng minh bằng mâu thuẫn rằng nếu đường dẫn dài nhất nằm giữa hai nút và một hoặc cả hai nút không phải là nút lá thì chúng ta có thể mở rộng đường dẫn để có đường dẫn dài hơn.

Vì vậy, một cách đầu tiên là kiểm tra các nút nào là nút lá, sau đó khởi động BFS từ một trong các nút lá để lấy nút xa nhất từ ​​nút đó.

Thay vì lần đầu tiên tìm thấy nút nào là nút lá, chúng ta bắt đầu BFS từ một nút ngẫu nhiên và sau đó xem nút nào ở xa nút đó nhất. Đặt nút xa nhất là x. Rõ ràng là x là một nút lá. Bây giờ nếu chúng ta bắt đầu BFS từ x và kiểm tra nút xa nhất từ ​​nó, chúng ta sẽ nhận được câu trả lời.

Nhưng điều gì đảm bảo rằng x sẽ là điểm cuối của một đường dẫn tối đa?

Hãy xem ví dụ: -

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

Giả sử tôi bắt đầu BFS của tôi từ 6. Nút ở khoảng cách tối đa từ 6 là nút 7. Sử dụng BFS chúng ta có thể nhận được nút này. Bây giờ chúng ta đánh dấu sao BFS từ nút 7 để có được nút 9 ở khoảng cách tối đa. Đường dẫn từ nút 7 đến nút 9 rõ ràng là đường dẫn dài nhất.

Điều gì xảy ra nếu BFS bắt đầu từ nút 6 cho 2 là nút ở khoảng cách tối đa. Sau đó, khi chúng tôi sẽ BFS từ 2, chúng tôi sẽ nhận được 7 là nút ở khoảng cách tối đa và đường dẫn dài nhất sẽ là 2-> 1-> 4-> 5-> 7 với chiều dài 4. Nhưng độ dài đường dẫn dài nhất thực tế là 5. Điều này không thể xảy ra vì BFS từ nút 6 sẽ không bao giờ cho nút 2 là nút ở khoảng cách tối đa.

Mong rằng sẽ giúp.


1
đó là một lời giải thích đơn giản và rõ ràng! cảm ơn :)
anekix

4

Đây là một bằng chứng theo sau bộ giải pháp MIT được liên kết chặt chẽ hơn trong câu hỏi ban đầu. Để rõ ràng, tôi sẽ sử dụng cùng một ký hiệu mà họ sử dụng để việc so sánh có thể được thực hiện dễ dàng hơn.

Giả sử chúng ta có hai đỉnh b sao cho khoảng cách giữa ab trên đường dẫn p ( a , b ) là một đường kính, ví dụ khoảng cách d ( a , b ) là khoảng cách tối đa có thể giữa hai điểm bất kỳ trong cây. Giả sử chúng ta cũng có một nút s a , b (nếu s = a , thì rõ ràng là lược đồ hoạt động, vì BFS đầu tiên sẽ nhận b và thứ hai sẽ trở về a). Giả sử chúng ta cũng có một nútababp(a,b)d(a,b)sa,bs=ab sao cho d ( s , u ) = max x d ( s , x ) .ud(s,u)=maxxd(s,x)

Bổ đề 0: Cả b đều là các nút lá.ab

Bằng chứng: Nếu chúng không phải là các nút lá, chúng ta có thể tăng bằng cách mở rộng các điểm cuối thành các nút lá, mâu thuẫn với d ( a , b ) là đường kính.d(a,b)d(a,b)

Bổ đề 1: .max[d(s,a),d(s,b)]=d(s,u)

Chứng minh: Giả sử vì mâu thuẫn rằng cả d ( s , b ) đều nghiêm ngặt ít hơn d ( s , u ) . Chúng tôi xem xét hai trường hợp:d(s,a)d(s,b)d(s,u)

Trường hợp 1: đường dẫn không không chứa đỉnh s . Trong trường hợp này, d ( a , b ) không thể là đường kính. Để xem tại sao, hãy để t là đỉnh duy nhất trên p ( a , b ) với khoảng cách nhỏ nhất đến s . Sau đó, chúng ta thấy rằng d ( a , u ) = d ( a , t ) + d ( t , sp(a,b)sd(a,b)tp(a,b)s , vì d ( s , u ) > d ( s , b ) = d ( s , t ) + d ( t , b ) > d (d(a,u)=d(a,t)+d(t,s)+d(s,u)>d(a,b)=d(a,t)+d(t,b) . Tương tự, chúng ta cũng sẽ có d ( b , u ) > d ( a , b ) . Điều này mâu thuẫn với d ( a , b ) là đường kính.d(s,u)>d(s,b)=d(s,t)+d(t,b)>d(t,b)d(b,u)>d(a,b)d(a,b)

Trường hợp 2: đường dẫn chứa đỉnh s . Trong trường hợp này, d ( a , b ) một lần nữa không thể là đường kính, vì đối với một số đỉnh u sao cho d ( s , u ) = max x d ( s , x ) , cả d ( a , u )d ( b , u ) sẽ lớn hơn dp(a,b)sd(a,b) ud(s,u)=maxxd(s,x)d(a,u)d(b,u) .d(a,b)

Bổ đề 1 đưa ra lý do tại sao chúng ta bắt đầu tìm kiếm Breadth-First thứ hai tại đỉnh được phát hiện lần cuối của BFS đầu tiên. Nếu u là đỉnh duy nhất có khoảng cách lớn nhất có thể từ s , thì theo Bổ đề 1, nó phải là một trong những điểm cuối của một số đường có khoảng cách bằng đường kính và do đó, một BFS thứ hai với u là gốc rõ ràng tìm thấy đường kính. Mặt khác, nếu có ít nhất một đỉnh v khác sao cho d ( s , v ) = d ( s , u ) , thì chúng ta biết rằng đường kính là duusuvd(s,v)=d(s,u) và không quan trọng chúng ta bắt đầu BFS thứ hai tại u hay v .d(a,b)=2d(s,u)uv


Tuyệt vời. Cảm ơn đã đăng câu trả lời này. Tôi ngạc nhiên khi câu trả lời này đã không nhận được bất kỳ sự ủng hộ nào.
Zephyr

0

Đầu tiên chạy DFS từ một nút ngẫu nhiên sau đó đường kính của cây là đường dẫn giữa các lá sâu nhất của nút trong cây con DFS của nó: enter image description here


4
Tại sao điều này làm việc?
Yuval Filmus

0

Theo định nghĩa của BFS, khoảng cách (từ nút bắt đầu) của mỗi nút được khám phá bằng với khoảng cách của nút trước đó được khám phá hoặc lớn hơn 1. Do đó, nút cuối cùng được BFS khám phá sẽ nằm trong số những điểm xa nhất so với điểm bắt đầu nút.

Do đó, thuật toán sử dụng BFS hai lần lên tới "Chọn một nút tùy ý . Tìm nút cách xa x nhất (nút cuối cùng được tìm thấy bởi BFS bắt đầu từ x ). Tìm nút b xa nhất từ một (nút cuối cùng được tìm thấy bởi BFS bắt đầu từ a ). ", do đó tìm thấy hai nút có khoảng cách tối đa từ nhau.xaxxbaa


1
Cảm ơn câu trả lời với trực giác. Tuy nhiên, "do đó" trong câu cuối cùng của bạn không rõ ràng. Tại sao điều đó theo sau? Tại sao nút xa nhất từ phải là một trong hai nút ở khoảng cách tối đa với nhau? Có vẻ như cần một số bằng chứng. x
DW

Tôi không chắc làm thế nào để xây dựng một bằng chứng như vậy. Tôi cảm thấy như điều ngược lại là trực giác: nếu hai nút ở khoảng cách tối đa với nhau, thì đối với bất kỳ nút đã cho nào, một trong hai nút nằm ở khoảng cách lớn nhất có thể từ nó.
Extrarius

Yêu cầu "trực giác đúng" nói chung không đúng đối với các biểu đồ chung. Xem biểu đồ trong cs.stackexchange.com/a/213/755 và tưởng tượng bắt đầu BFS từ nút (nghĩa là let x = v ); sau đó nó sẽ chọn a = u và tìm nút b ở khoảng cách lớn nhất từ a , nhưng điều đó không tìm thấy hai nút có khoảng cách tối đa với nhau. Vì vậy, tuyên bố được tuyên bố, nếu đúng, phải dựa vào một số thuộc tính đặc biệt của cây không giữ cho biểu đồ chung. vx=va=uba
DW

Có, nhưng câu hỏi này chỉ định các cây không bị ảnh hưởng, đó là bối cảnh mà tôi đang hướng đến. Các chu kỳ chặn và các cạnh được định hướng làm cho nhiều vấn đề về đồ thị trở nên đơn giản hơn đáng kể.
Extrarius

0

Một điều quan trọng cần biết là một cây luôn luôn phẳng, có nghĩa là nó có thể được đặt trên một mặt phẳng, do đó, suy nghĩ 2 chiều thông thường hoạt động. Trong trường hợp này, thuật toán cho biết bắt đầu từ bất cứ đâu, đi càng xa càng tốt. Khoảng cách từ điểm đó đến càng xa bạn có thể đi từ điểm đó là khoảng cách dài nhất trong cây, và do đó đường kính.

Phương pháp này cũng sẽ hoạt động để tìm đường kính của một hòn đảo thực, thực nếu chúng ta xác định đó là đường kính của vòng tròn nhỏ nhất sẽ bao quanh hoàn toàn hòn đảo.


0

@op, cách các trường hợp được xác định trong PDF có thể hơi sai.

Tôi nghĩ rằng hai trường hợp nên là:

  1. p1p2p1p2tp2s

  2. p1p2tp2p1

Phần còn lại của bằng chứng trong PDF nên tuân theo.

Với định nghĩa này, con số hiển thị bởi OP rơi vào Trường hợp 2.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.