Giả sử P là một đa giác đơn có n đỉnh; s, v là hai điểm thuộc đa giác P. Ký hiệu đ-ờng đi ngắn nhất từ s tới v trong P là ( , )s v và ( , )
v s v . Giả sử
d = uw là một đ-ờng chéo hay một cạnh của P và a là điểm mà hai đ-ờng
( , )a u
và ( , )a w rẽ ra. Khi đó ( , )a u ,( , )a w là các đ-ờng lồi ngoài, tức là: với C là miền trong giới hạn bởi ( , )a u , ( , )a w và đoạn uw, khi đó: conv(( , )a u ) C = , conv(( , )a w ) C = .
Định nghĩa 2.2.1 (Xem [17], trang 211) Hợp của các đ-ờng ( , )a u ,
( , )a w
với d = uw gọi là Phễu F. Khi đó, a gọi là đỉnh của phễu (điểm sâu nhất của phễu), kí hiệu: CUSP(F ) = a.
Đối với phễu F và đ-ờng chéo uw’của P ta có hai tr-ờng hợp xác định phễu mới đ-ợc nối trực tiếp từ w’đến a (phễu co rút lại) hay tiếp tuyến từ w’đến
( , )a u
hoặc ( , )a w (đỉnh phễu dịch chuyển, đuôi mở rộng, phễu co rút lại).
Bài toán 2.2.1 Cho hình ống tay P ’, xác định bởi s và t. Hãy tìm thuật toán xác định đ-ờng đi ngắn nhất từ s đến t.
Cho: Một phép tam giác phân T đa giác đơn P .
Tìm: Một đa giác đơn P ’ là hình ống tay.
B-ớc 0 Tạo ra cây đối ngẫu G = (V, E) của phép tam giác phân đa giác đơn P,
, s(s), t(t) với (s),(t)V
B-ớc 1 Thực hiện Dijkstra(G,(s),(t)) (xem Thuật toán 1.5.1). Đặt P ’= 1 k i i ,ilà các đỉnh của đ-ờng đi ngắn nhất từ (s) đến(t) (i = 1,k).
Chúng tôi trình bày thuật toán Phễu của Lee và Preparata nh-ng có sự cải tiến của Guibas, Hershberger, Sharir và Tarjan (Xem [17]) để giải bài này.
2.2.2. Thuật toán phễu
Giả sử d = uw là một đ-ờng chéo của P ’, với phễu hiện thời F = Fuw là một danh sách phân loại [ul, ul-1, ..., a, w1, ...,wk], ở đây a = u0 = w0 là đỉnh của
F , ( , )a u = [u0, ..., ul], ( , )a w = [w0, ..., wk] và ul = u, wk = w. Chúng ta kí hiệu trong thuật toán đỉnh của cái phễu hiện tại là CUSP(F ).
Thuật toán bắt đầu từ s với CUSP(F ) = s và tiếp tục một cách đệ quy nh- sau:
Thuật toán 2.1.2 (FUNNEL(F )) (xem[13], trang 212)
Cho: Đa giác P ’ là hình ống tay.
Tìm: Các đỉnh v = CUSP(F).
Giả sử u, w là điểm đầu tiên và điểm cuối cùng của F , và a = CUSP(F) ( nh- vậy F =( , )a u ( , )a w ).
Giả sử uwx là tam giác trong phép tam giác phân T của đa giác P ’ với đ-ờng chéo uw là một cạnh của tam giác.
(a) Tìm kiếm phần tử v của F , sao cho vx là một tiếp tuyến của F
tại v (nếu đ-ờng thẳng ax không cắt F thì v = a). Việc tìm kiếm hoàn toàn t-ơng tự nh- việc tìm kiếm một tiếp tuyến của đa giác lồi từ một điểm bên ngoài (theo Thuật toán 1.4.2). Chia F x
thành hai phễu mới F1= [u, ..., v, x] và F2= [x, v, ..., w]. Nếu
v( , )a u thì đặt CUSP(F1) := v, CUSP(F2) := a. Mặt khác, nếu
v( , )a w thì CUSP(F1) := a, CUSP(F2) := v. (b) Đặt ( , )s x := ( , )s v vx.
(c) Nếu ux là đ-ờng chéo của P ’ thì gọi FUNNEL(F1) một cách đệ quy.
(d) Nếu wx là đ-ờng chéo của P ’ thì gọi FUNNEL(F2) một cách đệ quy.
(e) Nếu t nằm trong uwx thì ta chọn t := x.
Kết quả thuật toán cho ta đ-ờng đi ngắn nhất Z từ s đến t với Z = [s=v1, v2, ..., vm, t]. Trong đó vi , i = 1, 2, ..., m là các đỉnh của các phễu F .
Tính đúng đắn của thuật toán
Chứng minh tính đúng đắn của thuật toán phễu (Xem [17]).
Độ phức tạp của thuật toán
Độ phức tạp của thuật toán phễu là O(n) (Xem [17], trang 213-215).