1. Trang chủ
  2. » Tất cả

Bài toán LCA

5 1 0

Đang tải... (xem toàn văn)

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 5
Dung lượng 17,46 KB

Nội dung

Bài tốn LCA (Least Common Ancestor) 03/08/2015ĐỂ LẠI BÌNH LUẬN Bài toán -Đầu vào : với n đỉnh -Chất vấn : với nút u, v T, chất vấn LCA (u,v) cho biết cha chung gần đỉnh u,v T, tức cho biết đỉnh xa gốc cha u, v Lời giải -Từ đầu vào ta xây dựng mảng cha[1…n] với cha[i] cho ta biết nút cha nút i Sau ta xây dựng mảng b[1…n][0…logN] với b[i,j] cho ta biết nút tổ tiên thứ j nút i Xây dựng mảng b NlogN sử dụng phương pháp QHĐ sau: procedure creat; begin b[0,0]:=0; for i:=1 to n b[i,0]:=cha[i]; for j:=1 to log for i:=0 to n b[i,j]:=b[b[i,j-1],j-1]; end; -Gọi d(i) khoảng cách tới gốc nút i Ta tính d[i] DFS sau: function dfs(u:longint):longint; var v:longint; begin free[u]:=false; if u=0 then exit(0); if not free[cha[u]] then begin d[u]:=d[cha[u]]+1; exit(d[u]); end else d[u]:=dfs(cha[u])+1; exit(d[u]); end; procedure tinh; begin for i:=1 to n free[i]:=true; free[0]:=false; d[0]:=0; for i:=1 to n if free[i] then d[i]:=dfs(i); end; -Để xác định LCA(u,v) ta thực bước sau :  Giả sử d(u) > d(v), ta thay u nút tổ tiên u đến d(u)=d(v) Gọi t chênh lệch khoảng cách so với gốc u v Bình thường để đưa u tổ tiên cho d[u]=d[v] ta cần thực u=cha[u] t lần, thời gian Để nhanh ta lợi dụng mảng b xây dựng Ta cần đưa u tổ tiên thứ t u, ta cần phân tích t thành tổng lũy thừa để sử dụng mảng b Ví dụ cần đưa u tổ tiên thứ nó, ta có 7=2 2+21+20 → tổ tiên thứ u= b[b[b[u,2],1],0] (Để có 7=22+21+20 ta sử dụng hàm getbit dưới)  Khi d(u)=d(v) ta thay u v nút tổ tiên tương ứng cho thỏa mãn d(u)=d(v) đến u=v Khi ta có kết cần tìm Trong q trình thay nút nút tổ tiên nó, ta sử dụng mảng b để nhảy lần nhiều bước ⇒ Khi độ phức tạp thuật toán O(NlogN) #Code Pascal function getbit(k,x:longint):byte; begin getbit:=(x shr(k-1)) and 1; end; function lca(u,v:longint):longint; var t,bit,k:longint; begin if d[u]>=d[v] then begin if d[u]>d[v] then begin t:=d[u]-d[v]; for bit:=log downto if getbit(bit,t)=1 then u:=b[u,bit-1]; end; for k:=log downto if b[u,k]b[v,k] then begin u:=b[u,k]; v:=b[v,k]; end else lca:=b[u,k]; if u=v then lca:=u; end else result:=lca(v,u); end; FSELECT spoj – Làm quen bạn 27/10/2015ĐỂ LẠI BÌNH LUẬN Link: http://vn.spoj.com/problems/FSELECT/ Đề Sau tham dự IOI OLPSV, Nguyên chuyển đến nhà Khu nhà Nguyên cóN người bạn hàng xóm ( N ≤ 200000) Vì dễ bị nhầm nên Nguyên đánh số bạn từ đến N Giữa ngơi nhà có đường tạo thành Khoảng cách hai nhà kề đơn vị CóK hẹn ( K ≤ N/2) Nguyên đưa để làm quen với bạn Để tính tốn chi phí mời bạn, Ngun muốn biết xem khoảng cách xa nhà hẹn ? Bạn giúp Nguyên giải vấn đề Input -Dòng gồm số N K –N dòng tiếp theo, dòng thứ i gồm số x y Trong x thứ tự hẹn mà bạn thứ i tham gia, y nhà hàng xóm bạn thứ i Nếu y = gốc khu dân cư (có thể hiểu gốc cây) Output Gồm K dòng, dòng thứ i thể đường xa tìm ngơi nhà người bạn hẹn thứ i Example Input 1 2 1 Output Giải thích -3| -1/ | \ | -6-Trong hẹn thứ gồm bạn bạn số 1, số số Khoảng cách xa nhà hẹn thứ ( nhà bạn số số 6) Tương tự, hẹn thứ gồm bạn số 2, số số 5, khoảng cách xa Lời giải -Dựa thuật toán LCA ... k:=log downto if b[u,k]b[v,k] then begin u:=b[u,k]; v:=b[v,k]; end else lca: =b[u,k]; if u=v then lca: =u; end else result: =lca( v,u); end; FSELECT spoj – Làm quen bạn 27/10/2015ĐỂ LẠI BÌNH LUẬN Link:... nhảy lần nhiều bước ⇒ Khi độ phức tạp thuật toán O(NlogN) #Code Pascal function getbit(k,x:longint):byte; begin getbit:=(x shr(k-1)) and 1; end; function lca( u,v:longint):longint; var t,bit,k:longint;... nhà bạn số số 6) Tương tự, hẹn thứ gồm bạn số 2, số số 5, khoảng cách xa Lời giải -Dựa thuật toán LCA

Ngày đăng: 15/08/2016, 15:07

w