Skkn chuyên đề bài toán tổ tiên chung gần nhất lca

57 4 0
Skkn chuyên đề bài toán tổ tiên chung gần nhất lca

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

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

Thông tin tài liệu

Chuyên đề Hội thảo khoa học trường THPT Chuyên khu vực Duyên Hải ĐBBB 2020 HỘI THẢO KHOA HỌC CÁC TRƯỜNG THPT CHUYÊN KHU VỰC DUYÊN HẢI VÀ ĐỒNG BẰNG BẮC BỘ NĂM 2020 Môn: Tin học Bài toán: “Tổ tiên chung gần nhất”-LCA Người viết: Nguyễn Như Thắng Đơn vị công tác: Trường THPT Chuyên tỉnh Lào Cai Tháng 9/2020 Trang skkn Chuyên đề Hội thảo khoa học trường THPT Chuyên khu vực Duyên Hải ĐBBB 2020 MỤC LỤC Bảng thích số tên, thuật ngữ viết tắt Mở đầu Một số khái niệm, kiến thức Dạng tốn cần đến LCA Các phương pháp giải toán LCA 4.1 Duyệt tham lam 4.2 Chia 4.3 Kĩ thuật bảng thưa (Sparse table) 10 4.4 Dùng Euler tour 11 4.5 Xử lí kiểu Off-line (Tarjan's off-line LCA) 12 Một số tập ví dụ 13 5.1 Bài 1: Bài tập 14 5.1.1 Đề bài: LCA 14 5.1.2 Phân tích đề đề xuất thuật tốn 14 5.1.3 Test kèm theo 15 5.2 Bài 2: Tổ chức thi chạy Marathon 15 5.2.1 Đề bài: Marathon 15 5.2.2 Phân tích đề đề xuất thuật toán 16 5.2.3 Test kèm theo 17 5.3 Bài 3: Du lịch thành phố (NAIPC 2016) 17 5.3.1 Đề bài: Tourist 17 5.3.2 Phân tích đề đề xuất thuật toán 18 5.3.3 Test kèm theo 19 5.4 Bài 4: VOTREE (VNOI online 2015) 19 5.4.1 Đề 19 5.4.2 Phân tích đề đề xuất thuật toán 20 5.4.3 Test kèm theo 22 5.5 Bài 5: Tăng lương (Chọn đội tuyển IOI CROATIAN 2010) 22 5.5.1 Đề POVISICE 22 5.5.2 Phân tích đề đề xuất thuật toán 23 5.5.3 Test kèm theo 26 5.6 Bài 6: Nâng cấp mạng (VOI 2011) 26 5.6.1 Đề bài: UPGRANET 26 5.6.2 Phân tích đề đề xuất thuật toán 27 5.6.3 Test kèm theo 29 5.7 Bài 7: Dạo chơi đồng cỏ (PWALK – Spoj) 29 5.7.1 Đề bài: PWALK 29 5.7.2 Phân tích đề đề xuất thuật toán 30 Trang skkn Chuyên đề Hội thảo khoa học trường THPT Chuyên khu vực Duyên Hải ĐBBB 2020 5.7.3 Test kèm theo 31 5.8 Bài 8: TREEDGE 31 5.8.1 Đề TREEDGE 31 5.8.2 Phân tích đề đề xuất thuật tốn 32 5.8.3 Test kèm theo 34 5.9 Bài 9: Đường qua K cạnh 34 5.9.1 Đề bài: TREEQ 34 5.9.2 Phân tích đề đề xuất thuật toán 34 5.9.3 Test kèm theo 36 5.10 Bài 10: Tom & Jerry 36 5.10.1 Đề 36 5.10.2 Phân tích đề đề xuất thuật toán 37 5.10.3 Test kèm theo 40 5.11 Bài 11: Cập nhật thông tin 40 5.11.1 Đề bài: Update tree 40 5.11.2 Phân tích đề đề xuất thuật tốn 40 5.11.3 Test kèm theo 42 5.12 Bài 12: Cập nhật thông tin 42 5.12.1 Đề bài: Update tree2 42 5.12.2 Phân tích đề đề xuất thuật toán 43 5.12.3 Test kèm theo 46 5.13 Bài 13: Dạo chơi 46 5.13.1 Đề Walking 46 5.13.2 Phân tích đề đề xuất thuật toán 47 5.13.3 Test kèm theo 49 5.14 Bài 14: Cây đổi gốc 49 5.14.1 Đề bài: ROOTLESS 49 5.14.2 Phân tích đề đề xuất thuật toán 50 5.14.3 Test kèm theo 51 5.15 Bài 15: Cây đổi gốc 51 5.15.1 Đề bài: Rootless2 51 5.15.2 Phân tích đề đề xuất thuật toán 52 5.15.3 Test kèm theo 56 Một số tập tự luyện 56 Kết luận 56 Tài liệu tham khảo 57 Trang skkn Chuyên đề Hội thảo khoa học trường THPT Chuyên khu vực Duyên Hải ĐBBB 2020 Bảng thích số tên, thuật ngữ viết tắt Thuật ngữ, tên viết tắt Giải thích 𝑎𝑑𝑗 Kề (adjacent) ancestor Tổ tiên Binary lifting Nâng nhị phân, nhảy nhị phân 𝐵𝐼𝑇 Cây số nhị phân (Bianry index tree) BFS Duyệt đồ thị theo chiều rộng Cây gốc u Là phận ban đầu đỉnh gọi đến từ duyệt DFS(u) 𝑑𝑒𝑝𝑡ℎ độ sâu DFS Duyệt đồ thị theo chiều sâu (Depth first search) 𝑑𝑖𝑠𝑡 Khoảng cách (distance) DSU Tập hợp không giao (Disjoint set union) 𝐿𝐶𝐴 Tổ tiên chung gần (Lowest ancestor common) 𝑝𝑎𝑟 Cha (parents) root Gốc cây, đỉnh duyệt gọi DFS Segment tree Cây phân đoạn (cây quản lí đoạn) Sparse table Bảng thưa Trang skkn Skkn.chuyen.de.bai.toan.to.tien.chung.gan.nhat.lcaSkkn.chuyen.de.bai.toan.to.tien.chung.gan.nhat.lcaSkkn.chuyen.de.bai.toan.to.tien.chung.gan.nhat.lcaSkkn.chuyen.de.bai.toan.to.tien.chung.gan.nhat.lcaSkkn.chuyen.de.bai.toan.to.tien.chung.gan.nhat.lcaSkkn.chuyen.de.bai.toan.to.tien.chung.gan.nhat.lcaSkkn.chuyen.de.bai.toan.to.tien.chung.gan.nhat.lcaSkkn.chuyen.de.bai.toan.to.tien.chung.gan.nhat.lca Chuyên đề Hội thảo khoa học trường THPT Chuyên khu vực Duyên Hải ĐBBB 2020 Mở đầu Dạng “Tổ tiên chung gần nhất” phổ biến, dạng khơng dễ, địi hỏi học sinh có tư khá, nhiều địi hỏi học sinh sáng tạo vận dụng Học sinh cần có số kiến thức để đảm bảo học chuyên đề là: phương pháp Quy hoạch động cây; Đồ thị bản, duyệt đồ thị; kĩ thuật bảng thưa (Sparse table), cấu trúc liệu (Segment tree, BIT, DSU) Trong trình dạy đội tuyển lớp HSG lớp 11, đội tuyển HSG Quốc gia Từ toán dạng này, cho học sinh ôn lại kiến thức liên quan khác để giải toán LCA như: cấu trúc liệu sparse table, segment tree,…; ơn lại tốn RMQ; kĩ thuật Heavy light decomposition; kĩ thuật duỗi thành mảng (Euler tour); duyệt đồ thị; Quy hoạch động cây;… Một số khái niệm, kiến thức - Cây DFS: Quá trình duyệt đồ thị theo chiều sâu (DFS) đỉnh 𝑠 cho ta DFS gốc 𝑠 - Quan hệ cha-con DFS: Khi duyệt DFS, từ đỉnh 𝑢 ta gọi hàm tới thăm đỉnh 𝑣 đỉnh 𝑢 đỉnh cha đỉnh 𝑣 Ví dụ: Đỉnh cha đỉnh 2,3,4 Đỉnh 12,13 đỉnh 10 - Quan hệ tổ tiên-con cháu: Được định nghĩa đệ quy sau: + Đỉnh 𝑢 tổ tiên + Đỉnh cha đỉnh 𝑢 tổ tiên đỉnh 𝑢 + Cha tổ tiên 𝑢 tổ tiên 𝑢 Ta thấy, đỉnh 𝑢 tổ tiên tất đỉnh nhánh DFS gốc 𝑢 Ví dụ: Đỉnh tổ tiên đỉnh 7,10,11,12,13 Đỉnh tổ tiên đỉnh 6,8,9 - Độ sâu: Là khoảng cách đến đỉnh gốc (được tính số đỉnh, số cạnh, trọng số cạnh) Đỉnh gốc DFS quy ước độ sâu Ví dụ: Đỉnh có độ sâu 2; đỉnh 12,13 có độ sâu - Tổ tiên chung: Đỉnh 𝑤 tổ tiên đỉnh 𝑢 𝑣 𝑤 gọi tổ tiên chung 𝑢 𝑣 Ví dụ: Đỉnh tổ tiên chung đỉnh 12 đỉnh 13 - Định nghĩa tổ tiên chung gần (LCA) wiki: Trong lý thuyết đồ thị khoa học máy tính, LCA đỉnh 𝑢, 𝑣 đồ thị có hướng khơng chu trình (DAG) gốc 𝑇 đỉnh 𝑤 sâu (hay đỉnh xa gốc nhất) mà nhận 𝑢, 𝑣 làm cháu, coi đỉnh tổ tiên Ví dụ: Đỉnh tổ tiên chung gần đỉnh Đỉnh 10 tổ tiên chung gần 12,13 Trang Skkn.chuyen.de.bai.toan.to.tien.chung.gan.nhat.lcaSkkn.chuyen.de.bai.toan.to.tien.chung.gan.nhat.lcaSkkn.chuyen.de.bai.toan.to.tien.chung.gan.nhat.lcaSkkn.chuyen.de.bai.toan.to.tien.chung.gan.nhat.lcaSkkn.chuyen.de.bai.toan.to.tien.chung.gan.nhat.lcaSkkn.chuyen.de.bai.toan.to.tien.chung.gan.nhat.lcaSkkn.chuyen.de.bai.toan.to.tien.chung.gan.nhat.lcaSkkn.chuyen.de.bai.toan.to.tien.chung.gan.nhat.lca skkn Skkn.chuyen.de.bai.toan.to.tien.chung.gan.nhat.lcaSkkn.chuyen.de.bai.toan.to.tien.chung.gan.nhat.lcaSkkn.chuyen.de.bai.toan.to.tien.chung.gan.nhat.lcaSkkn.chuyen.de.bai.toan.to.tien.chung.gan.nhat.lcaSkkn.chuyen.de.bai.toan.to.tien.chung.gan.nhat.lcaSkkn.chuyen.de.bai.toan.to.tien.chung.gan.nhat.lcaSkkn.chuyen.de.bai.toan.to.tien.chung.gan.nhat.lcaSkkn.chuyen.de.bai.toan.to.tien.chung.gan.nhat.lca Chuyên đề Hội thảo khoa học trường THPT Chuyên khu vực Duyên Hải ĐBBB 2020 - Nhận xét thấy 𝐿𝐶𝐴(𝑢, 𝑣) đỉnh gặp đường từ 𝑢 gốc đường từ 𝑣 gốc Từ nhận xét ta hình thành cách giải toán LCA Dạng toán cần đến LCA Trong chun đề này, tơi tập trung vào dạng sau: - Các tập tìm kiếm, cập nhật thơng tin đỉnh nằm đường đơn từ 𝑢 đến 𝑣 Ví dụ tính khoảng cách cặp đỉnh (cây có trọng số, khơng có trọng số) - Dạng LCA kết hợp cấu trúc liệu như: Segment tree, Binay index tree, Disjoint set union,… - Dạng LCA kết hợp với quy hoạch động cây, khung, cầu-khớp,… - Dạng LCA có đổi gốc - Đánh dấu, cộng dồn có áp dụng LCA Theo nhận định tác giả dạng khó dạng phải biết kết hợp thêm dạng khác cây, kết hợp cấu trúc liệu; cần học sinh có sáng tạo phát cần áp dụng dạng toán LCA nào,… Các phương pháp giải tốn LCA Để trình bày số phương pháp giải toán LCA, tác giả đưa ví dụ có gốc liệu cho sau: Dữ liệu vào Kết Giải thích 13 lca(2,4)=1 12 lca(12,13)=10 13 lca(2,5)=1 14 lca(8,9)=6 35 lca(12,11)=7 36 lca(6,7)=3 37 68 69 10 11 10 12 10 13 24 Cho đồ thị gồm 13 đỉnh, 12 12 13 cạnh, câu hỏi truy vấn tìm 25 LCA 89 12 11 67 Trang Skkn.chuyen.de.bai.toan.to.tien.chung.gan.nhat.lcaSkkn.chuyen.de.bai.toan.to.tien.chung.gan.nhat.lcaSkkn.chuyen.de.bai.toan.to.tien.chung.gan.nhat.lcaSkkn.chuyen.de.bai.toan.to.tien.chung.gan.nhat.lcaSkkn.chuyen.de.bai.toan.to.tien.chung.gan.nhat.lcaSkkn.chuyen.de.bai.toan.to.tien.chung.gan.nhat.lcaSkkn.chuyen.de.bai.toan.to.tien.chung.gan.nhat.lcaSkkn.chuyen.de.bai.toan.to.tien.chung.gan.nhat.lca skkn Skkn.chuyen.de.bai.toan.to.tien.chung.gan.nhat.lcaSkkn.chuyen.de.bai.toan.to.tien.chung.gan.nhat.lcaSkkn.chuyen.de.bai.toan.to.tien.chung.gan.nhat.lcaSkkn.chuyen.de.bai.toan.to.tien.chung.gan.nhat.lcaSkkn.chuyen.de.bai.toan.to.tien.chung.gan.nhat.lcaSkkn.chuyen.de.bai.toan.to.tien.chung.gan.nhat.lcaSkkn.chuyen.de.bai.toan.to.tien.chung.gan.nhat.lcaSkkn.chuyen.de.bai.toan.to.tien.chung.gan.nhat.lca Chuyên đề Hội thảo khoa học trường THPT Chuyên khu vực Duyên Hải ĐBBB 2020 4.1 Duyệt tham lam Nhận xét để tìm tổ tiên chung gần đỉnh 𝑢, 𝑣 từ đỉnh này, ta lên bước phía gốc Đến vị trí gặp tổ tiên chung gần Phương pháp: Bước 1: Di chuyển đỉnh có độ sâu lớn đến đỉnh có độ sâu Bước 2: Nếu đỉnh chưa gặp ta di chuyển chúng đến gặp dừng lại, LCA chúng Các làm lâu trường hợp DFS suy biến thành dạng đường thẳng Đánh giá độ phức tạp thuật toán: - Độ phức tạp tiền xử lí (duyệt DFS): 𝑶(𝑵) - Độ phức tạp truy vấn là: 𝑶(𝑵)  Độ phức tạp thuật tốn chung: 𝑶(𝑵 ∗ 𝑸) Chương trình tham khảo: #include using namespace std; int n, q, par[100005], depth[100005]; vector adj[100005]; ///duyet DFS de xac dinh xau va tim cha cua cac dinh void dfs(int u, int p, int d) { depth[u] = d; par[u] = p; for(int v : adj[u]) { if(par[u] == v) continue; dfs(v, u, d + 1); } } int lca(int u, int v) { ///Tim LCA theo kieu Brute force if(depth[u] < depth[v]) swap(u, v); while(depth[u] > depth[v]) u = par[u]; while(u != v) { u = par[u]; v = par[v]; } return u; } int main() { cin >> n; for(int i = 1; i < n; i++) { int u, v; cin >> u >> v; adj[u].push_back(v); adj[v].push_back(u); } Trang Skkn.chuyen.de.bai.toan.to.tien.chung.gan.nhat.lcaSkkn.chuyen.de.bai.toan.to.tien.chung.gan.nhat.lcaSkkn.chuyen.de.bai.toan.to.tien.chung.gan.nhat.lcaSkkn.chuyen.de.bai.toan.to.tien.chung.gan.nhat.lcaSkkn.chuyen.de.bai.toan.to.tien.chung.gan.nhat.lcaSkkn.chuyen.de.bai.toan.to.tien.chung.gan.nhat.lcaSkkn.chuyen.de.bai.toan.to.tien.chung.gan.nhat.lcaSkkn.chuyen.de.bai.toan.to.tien.chung.gan.nhat.lca skkn Skkn.chuyen.de.bai.toan.to.tien.chung.gan.nhat.lcaSkkn.chuyen.de.bai.toan.to.tien.chung.gan.nhat.lcaSkkn.chuyen.de.bai.toan.to.tien.chung.gan.nhat.lcaSkkn.chuyen.de.bai.toan.to.tien.chung.gan.nhat.lcaSkkn.chuyen.de.bai.toan.to.tien.chung.gan.nhat.lcaSkkn.chuyen.de.bai.toan.to.tien.chung.gan.nhat.lcaSkkn.chuyen.de.bai.toan.to.tien.chung.gan.nhat.lcaSkkn.chuyen.de.bai.toan.to.tien.chung.gan.nhat.lca Chuyên đề Hội thảo khoa học trường THPT Chuyên khu vực Duyên Hải ĐBBB 2020 dfs(1, 0, 1); cin>>q; while(q ){ int u,v; cin>>u>>v; cout v; cout N>>Q>>P; for(int i=1; i>u>>v; adj[u].push_back(v),adj[v].push_back(u); } dfs(1, 0); build_sparse(); update_edges(); diff(1); build_partial(1, 0); query_edges(); } 5.12.3 Test kèm theo https://drive.google.com/drive/folders/1KXbl_1eGLcxtUAe3BovVJS7cER BZTtbp?usp=sharing 5.13 Bài 13: Dạo chơi 5.13.1 Đề Walking Cho đồ thị dạng với N đỉnh N-1 cạnh Hằng ngày có khỉ từ đỉnh 𝑎 đến đỉnh 𝑏 Chú thấy có số đỉnh thăm vào ngày trước Chú băn khoăn đường ngày hôm từ 𝑎 → 𝑏 có đường ngày trước giao với ngày hơm nay, hai đường giao đường có đỉnh chung Dữ liệu vào: Đọc vào từ tệp Walking.inp Dòng ghi số N, Q (1 ≤ 𝑁, 𝑄 ≤ 105 ) số đỉnh số ngày dạo chơi N-1 dòng ghi cặp số (𝑢, 𝑣) thể cạnh Q dòng ghi cặp số (𝑎, 𝑏) thể lộ trình dạo chơi ngày Kết ra: Ghi tệp Walking.out Q dịng, dịng thứ 𝑖 số ngày có khác qua đỉnh lộ trình ngày 𝑖 Ví dụ: Walking.inp Walking.out Giải thích Trang 46 Skkn.chuyen.de.bai.toan.to.tien.chung.gan.nhat.lcaSkkn.chuyen.de.bai.toan.to.tien.chung.gan.nhat.lcaSkkn.chuyen.de.bai.toan.to.tien.chung.gan.nhat.lcaSkkn.chuyen.de.bai.toan.to.tien.chung.gan.nhat.lcaSkkn.chuyen.de.bai.toan.to.tien.chung.gan.nhat.lcaSkkn.chuyen.de.bai.toan.to.tien.chung.gan.nhat.lcaSkkn.chuyen.de.bai.toan.to.tien.chung.gan.nhat.lcaSkkn.chuyen.de.bai.toan.to.tien.chung.gan.nhat.lca skkn Skkn.chuyen.de.bai.toan.to.tien.chung.gan.nhat.lcaSkkn.chuyen.de.bai.toan.to.tien.chung.gan.nhat.lcaSkkn.chuyen.de.bai.toan.to.tien.chung.gan.nhat.lcaSkkn.chuyen.de.bai.toan.to.tien.chung.gan.nhat.lcaSkkn.chuyen.de.bai.toan.to.tien.chung.gan.nhat.lcaSkkn.chuyen.de.bai.toan.to.tien.chung.gan.nhat.lcaSkkn.chuyen.de.bai.toan.to.tien.chung.gan.nhat.lcaSkkn.chuyen.de.bai.toan.to.tien.chung.gan.nhat.lca Chuyên đề Hội thảo khoa học trường THPT Chuyên khu vực Duyên Hải ĐBBB 2020 54 12 13 34 35 45 42 13 12 2 Ngày 1: Chưa có đường trước giao với đường 45 Ngày 2: Giao với ngày đỉnh Ngày 3: Giao với ngày 1,2 Ngày 4: Giao với ngày 2,3 5.13.2 Phân tích đề đề xuất thuật toán Để giải toán, ta quan tâm đến vấn đề sau: Vấn đề 1: Làm để biết (𝑢, 𝑣) có giao với (𝑢′ , 𝑣 ′ ) ngày trước đó? Cách đơn giản kiểm tra tất điểm (𝑢, 𝑣) có điểm thuộc đường 𝑢′ → 𝑣′ khơng Cách q chậm, ta có cách khác sau: Gọi 𝑤 = 𝑙𝑐𝑎(𝑢, 𝑣), 𝑤’ = 𝑙𝑐𝑎(𝑢’, 𝑣’) - Nếu 𝑤’ tổ tiên 𝑤, (𝑢, 𝑣) giao với (𝑢’, 𝑣’) 𝑢’ 𝑣’ nằm gốc 𝑤 - Nếu w’ nằm w, đương nhiên u’, v’ nằm w Do đó, (u,v) giao với (u’,v’) bắt buộc w’ phải nằm đường 𝑢 → 𝑣 Tuy nhiên, ta có tất cỡ 𝑄2 cặp, cặp lại xử lí 𝑙𝑜𝑔(𝑁), độ phức tạp thuật toán là: 𝑂(𝑄2 log(𝑁)) Vấn đề 2: Làm để đếm nhanh cặp giao với (𝑢, 𝑣)? Nhận xét thấy rằng, vấn đề giải với cấu trúc liệu có khả đếm (ví dụ: BIT, Segment tree) Ở ta dùng BIT cho trường hợp w’ tổ tiên w w tổ tiên w’ *) Cây BIT1 giải tình w’ tổ tiên w Mỗi thêm đường 𝑢 → 𝑣 ′ ta cập nhật thông tin giống UPDTREE2: Tăng thêm u’, v’ giảm lca(u’,v’) ′ Khi xét (u,v) kết tăng thêm tổng trọng số đỉnh thuộc w *) Cây BIT2 giải tình w’ cháu w Khi bắt buộc w’ phải nằm đường 𝑢 → 𝑣, hay nói cách khác BIT2 đếm số đỉnh mà LCA (𝑢, 𝑣) xuất từ 𝑟𝑜𝑜𝑡 → 𝑎, 𝑟𝑜𝑜𝑡 → 𝑏 trừ 𝑟𝑜𝑜𝑡 → 𝑙𝑐𝑎(𝑎, 𝑏), 𝑟𝑜𝑜𝑡 → 𝑝𝑎𝑟𝑒𝑛𝑡[𝑙𝑐𝑎(𝑎, 𝑏)] Để sử dụng BIT quản lý thông tin, ta phải quản lý đỉnh theo thứ tự duyệt đến duyệt xong thực DFS Khi LCA ta quản lý theo thứ tự duyệt DFS ln Độ phức tạp thuật tốn: 𝑂(𝑁 log(𝑁)) + 𝑄 log(𝑁)) Trang 47 Skkn.chuyen.de.bai.toan.to.tien.chung.gan.nhat.lcaSkkn.chuyen.de.bai.toan.to.tien.chung.gan.nhat.lcaSkkn.chuyen.de.bai.toan.to.tien.chung.gan.nhat.lcaSkkn.chuyen.de.bai.toan.to.tien.chung.gan.nhat.lcaSkkn.chuyen.de.bai.toan.to.tien.chung.gan.nhat.lcaSkkn.chuyen.de.bai.toan.to.tien.chung.gan.nhat.lcaSkkn.chuyen.de.bai.toan.to.tien.chung.gan.nhat.lcaSkkn.chuyen.de.bai.toan.to.tien.chung.gan.nhat.lca skkn Skkn.chuyen.de.bai.toan.to.tien.chung.gan.nhat.lcaSkkn.chuyen.de.bai.toan.to.tien.chung.gan.nhat.lcaSkkn.chuyen.de.bai.toan.to.tien.chung.gan.nhat.lcaSkkn.chuyen.de.bai.toan.to.tien.chung.gan.nhat.lcaSkkn.chuyen.de.bai.toan.to.tien.chung.gan.nhat.lcaSkkn.chuyen.de.bai.toan.to.tien.chung.gan.nhat.lcaSkkn.chuyen.de.bai.toan.to.tien.chung.gan.nhat.lcaSkkn.chuyen.de.bai.toan.to.tien.chung.gan.nhat.lca Chuyên đề Hội thảo khoa học trường THPT Chuyên khu vực Duyên Hải ĐBBB 2020 Chương trình tham khảo: #include using namespace std; const int N = 100005; int n,q,cnt,BIT1[N],BIT2[N],depth[N], up[N][19], out[N], in[N]; vector adj[N]; void dfs(int x, int p) { in[x] = ++cnt; up[cnt][0] = in[p]; depth[cnt] = depth[in[p]]+1;; for(int i=1; i= 0; i ) if(depth[up[u][i]] >= depth[v]) { u = up[u][i]; } if(u == v) return u; for(int i = 17; i >= 0; i ) if(up[u][i] != up[v][i]) { u = up[u][i], v = up[v][i]; } return up[u][0]; } void update(int BIT[], int x, int val) { while(x0) { ret += BIT[id]; id &= (id-1); } return ret; } int get(int BIT[], int l, int r) { return get(BIT,r) - get(BIT,l-1); } int main() { scanf("%d%d",&n,&q); for(int i =1; i= 0; i ) if(depth[up[u][i]] >= depth[v]) { u = up[u][i]; } if(u == v) return u; for(int i = 17; i >= 0; i ) if(up[u][i] != up[v][i]) { u = up[u][i]; v = up[v][i]; } return up[u][0]; } int dist(int u, int v) { int x = lca(u, v); Trang 50 Skkn.chuyen.de.bai.toan.to.tien.chung.gan.nhat.lcaSkkn.chuyen.de.bai.toan.to.tien.chung.gan.nhat.lcaSkkn.chuyen.de.bai.toan.to.tien.chung.gan.nhat.lcaSkkn.chuyen.de.bai.toan.to.tien.chung.gan.nhat.lcaSkkn.chuyen.de.bai.toan.to.tien.chung.gan.nhat.lcaSkkn.chuyen.de.bai.toan.to.tien.chung.gan.nhat.lcaSkkn.chuyen.de.bai.toan.to.tien.chung.gan.nhat.lcaSkkn.chuyen.de.bai.toan.to.tien.chung.gan.nhat.lca skkn Skkn.chuyen.de.bai.toan.to.tien.chung.gan.nhat.lcaSkkn.chuyen.de.bai.toan.to.tien.chung.gan.nhat.lcaSkkn.chuyen.de.bai.toan.to.tien.chung.gan.nhat.lcaSkkn.chuyen.de.bai.toan.to.tien.chung.gan.nhat.lcaSkkn.chuyen.de.bai.toan.to.tien.chung.gan.nhat.lcaSkkn.chuyen.de.bai.toan.to.tien.chung.gan.nhat.lcaSkkn.chuyen.de.bai.toan.to.tien.chung.gan.nhat.lcaSkkn.chuyen.de.bai.toan.to.tien.chung.gan.nhat.lca Chuyên đề Hội thảo khoa học trường THPT Chuyên khu vực Duyên Hải ĐBBB 2020 int res = depth[u] + depth[v] - * depth[x]; return res; } int main() { cin >> n; for(int i = 1; i < n; i++) { int u, v; cin >> u >> v; adj[u].push_back(v); adj[v].push_back(u); } depth[1] = 1; dfs(1); cin >> q; pair p[6]; while(q ) { int u, v, r; cin >> u >> v>>r;; p[0].second = u; p[1].second = v; p[2].second = r; p[3].second = lca(r, u); p[4].second = lca(r, v); p[5].second = lca(u, v); for(int i = 0; i < 6; i++) { int x = p[i].second; p[i].first = dist(x, r) + dist(x, u) + dist(x, v); } sort(p, p + 6); cout

Ngày đăng: 28/12/2023, 22:01

Tài liệu cùng người dùng

Tài liệu liên quan