Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 36 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
36
Dung lượng
585,62 KB
Nội dung
SỞ GIÁO DỤC VÀ ĐÀO TẠO X TRƯỜNG THPT CHUYÊN XXX - - CẤU TRÚC DỮ LIỆU NÂNG CAO DISJOINT – SET - UNION XXX, 2019 - 2020 MỤC LỤC PHẦN I: MỞ ĐẦU .2 Lý 2 Mục địch nghiên cứu Thời gian địa điểm Địng góp mặt thực tiễn PHẦN II: NỘI DUNG CHƯƠNG 1: TỔNG QUAN 1.1 Bài toán (*) 1.2 Định nghĩa .5 1.3 Các phép toán 1.4 Cài đặt DSU hiệu với cấu trúc 1.5 Áp dụng DSU giải toán (*) CHƯƠNG 2: ỨNG DỤNG CỦA DSU 2.1 Xác định quản lý thành phần liên thông đồ thị 2.2 Xác định thành phần liên thông ảnh 2.3 Nén bước nhảy đoạn/Tô màu dãy offline .9 2.4 Xác định khoảng cách đến điểm đại diện 10 2.5 Cây khung nhỏ 11 2.6 Thành phần song liên thông 11 2.7 Giải toán RMQ offline với độ phức tạp số .12 2.8 Kiểm tra đồ thị vơ hướng có chu trình hay khơng 13 CHƯƠNG BÀI TẬP 14 3.1 Dạng toán liên quan đến thành phân song liên thông 14 Bài Mạng máy tính an tồn (SAFENET2.CPP) 14 3.2 Dạng toán liên quan đến thành phần liên thông đồ thị 15 Bài Xóa cạnh: 15 Bài Giao thơng an tồn 17 Bài Tô màu (PreVNOI 2016) 19 Bài Tái cấu trúc 21 Bài Kho báu (TREASURE.CPP) 24 3.3 Dạng toán liên quan đến khung 27 Bài Hệ thống điện (ELECTRIC.cpp) .27 Bài Đơn giản hóa trang trại (SIMPLIFY.cpp) .30 3.4 Dạng khác 31 Bài Tiệc khiêu vũ .31 Bài H - Height Preservation 33 PHẦN III: KẾT LUẬN 35 PHẦN IV: TÀI LIỆU THAM KHẢO: 35 PHẦN I: MỞ ĐẦU Lý chọn Đề thi học sinh quốc gia, kì thi Online, …trong năm gần tập đồ thị chiếm tỉ lệ lớn Các toán ngày nâng cao độ khó thuật tốn cấu trúc liệu Có nhiều cấu trúc liệu nâng cao ngày xuất nhiều đề thi Trong đó, cấu trúc liệu Disjoint – Set - Union (DSU) cấu trúc liệu quan trọng Tuy nhiên, Tài liệu viết DSU hạn chế đặc biệt tiếng Việt Do vậy, chọn chủ đề DSU làm đề tài nghiên cứu Mục địch nghiên cứu Mục đích viết chuyên đề vừa để tổng hợp lại kiến thức, sưu tầm lại hệ thống tập DSU phục vụ cho công tác dạy đội tuyển Thời gian địa điểm Đề thực năm học trường THPT Chuyên XXX Địng góp mặt thực tiễn Chun đề trình bày hai kĩ thuật cải tiến cài đặt DSU là: nén lộ trình hợp thứ hạng Qua đó, giảm độ phức tạp hai truy vấn DSU xuống O ( logn ) ,O(α ( n)) Bên cạnh ứng dụng phổ biến DSU xác định quản lý thành phần liên thông đồ thị, thành phần liên thông ảnh, thuật toán Kruskal, SKKN áp dụng DSU để giải toán kinh điển RMQ, tìm thành phần song liên thơng, kiểm tra chu trình đồ thị, bước nhảy đoạn Qua đó, cho thấy DSU cịn sử dụng thay cách hiệu cho cấu trúc liệu tiếng IT với kĩ thuật Lazy Propagation Các tốn đề thi HSGQG ln cập nhật cách liên tục có phổ kiến thức rộng Vì vậy, ngồi việc trang bị cho học sinh kiến thức cần rèn luyện cho học sinh kĩ phân loại, đoạn nhận thuật tốn Để học sinh dễ dạng việc đoán nhận dạng toán sử dụng DSU Trong chuyên đề phân dạng tập thành ba dạng chính: Dạng tốn liên quan đến thành phân liên thơng đồ thị, dạng tốn liên quan đến khung nhỏ số toán khác Các tập giới thiệu viết lựa chọn kĩ lưỡng có đủ test chấm, lời giải chương trình kèm theo Vì vậy, chuyên đề tài liệu phục vụ thiết thực cho việc giảng dạy đội tuyển ôn thi học sinh giỏi quốc gia, khu vực, kì thi online, PHẦN II: NỘI DUNG CHƯƠNG 1: TỔNG QUAN 1.1 Bài tốn (*) Tìm đường hai đỉnh đồ thị tốn lại đóng vài trị vơ quan trọng lý thuyết đồ thị, nhiều vấn đề đồ thị bắt nguồn quy toán Chúng ta xét toán cụ thể sau: Cho đồ thị ( G ) ban đầu đồ thị rỗng Bài toán yêu cầu thực q truy vấn có dạng i ,u , v : Nếu i=1 thêm cạnh ( u , v ) ; ( v , u ) đồ thị ( G ) Nếu i=2 trả lời hai đỉnh u , v có đường đến hay khơng? Thuật tốn: Với truy vấn i=1 thơng thường thực với độ phức tạp O(1) nên truy vấn tạm thời xem có cánh thực tối ưu Tuy nhiên, với truy vấn loại i=2 tốn tìm đường hai đỉnh u , v Đây toán đồ thị Chúng ta sử dụng thuật toán DFS (Depthfirst search) BFS (Breadth-first search) Cả hai thuật toán cho độ phức tạp O ( n ) (n số đỉnh đồ thị) Vì vậy, sử dụng thuật tốn DFS BFS độ phức tạp thuật tốn O(q n) Do vậy, thuật tốn khơng khả thi với trường hợp q ,n lớn Điều thúc đẩy việc cải tiến thuật toán để giảm độ phức tạp thuật toán xuống O(q log (n)) O(q) Trong phần chun đề, tơi trình bày cấu trúc liệu Disjoint – Set – Union (DSU) thực toán với độ phức tạp O(q log( n)) O(q α (n)) 1.2 Định nghĩa Trong khoa học máy tính, Cấu trúc liệu Disjoint – Set - Union (hợp tập hợp không giao nhau) cấu trúc liệu quản lý phần tử phân chia thành tập không giao DSU cung cấp phép toán: thêm tập mới, kết hợp tập lại với nhau, xác định phần tử có tập hợp hay khơng Cấu trúc liệu Disjoint – Set - Union có nhiều ứng dụng thuật toán đồ thị đặc biệt thuật tốn Kruskal để tìm khung nhỏ 1.3 1.4 Các phép toán Make_set(v): Tạo tập hợp để chứa phần tử v Union_set(a, b): Hợp hai tập hợp (tập hợp chứa phần tử a tập hợp chứa phần tử b) Find_set(v): Trả phần tử đại diện tập hợp mà chứa phần tử v Phần tử đại diện lựa chọn cho tập hợp phần tử thay đổi chọn lại sau phép toán Union_set Phần tử đại diện sử dụng để kiểm tra hai phần tử có tập hợp hay không Cài đặt DSU hiệu với cấu trúc Chúng ta lưu tập hợp dạng rừng Mỗi tương ứng với tập hợp gốc phần tử đại diện Hình minh họa cách tạo Hình Trước tiên, phần tử cài đặt thành mà gốc phần tử Sau kết hợp chứa đỉnh chứa đỉnh thành gốc 1, kết hợp chứa đỉnh với chứa đỉnh thành gốc Cuồi kết hợp gốc với gốc thành gốc a) Cách cài đặt đơn gian (naive) void make_set(int v) { parent[v] = v; } int find_set(int v) { if (v == parent[v]) return v; return find_set(parent[v]); } void union_sets(int a, int b) { a = find_set(a); b = find_set(b); if (a != b) parent[b] = a; } Tuy nhiên, cách cài đặt không hiệu quả, dễ dàng nhận thầy trường hợp suy biến thành chuỗi dài hàm find_set(v) có độ phức tạp O(n) Sau đây, tơi trình bày hai cách tối ưu để làm việc hiệu b) Tối ưu hóa phương pháp nén lộ trình Bước tối ưu thiết kế để tăng tốc hàm find_set() Nếu gọi hàm find_set(v) đỉnh v đó, thực chất tìm gốc p cho tất đỉnh đường v p Mẫu chốt bước nén lộ trình làm cho đường node ngắn hơn, cách cài đặt cha đỉnh thăm trực tiếp p Hình Minh họa bước nén lộ trình gọi hàm Find_set(7) Bến trái cây, bên phải nén lộ trình gọi hàm Find_set(7), rút ngắn đường đỉnh Sau cài đặt hàm Find_set(): int find_set(int v) { if (v == parent[v]) return v; return parent[v] = find_set(parent[v]); } Hàm thực trước tiên tìm gốc p v, sau gán (theo kiểu stack) gốc trực tiếp đỉnh đường từ v đến p p Cách cải tiến đơn giản giúp làm giảm độ phức tạp hàm Find_set() xuống trung bình O(logn) c) Tối ưu hóa hàm Union_set size/rank Trong phần này, tối ưu hàm Union_set() Nói xác phải xác định phải gắn vào Trong cách cài đặt đơn gian (naive) trình bày hai gắn vào Trong thực hành cách cài đặt dẫn đến chuỗi có độ dài O(n) Trong bước cài tối ưu lựa chọn cận thận việc lựa chọn phải ghép vào Có nhiều phương pháp thích nghi (heuristics) sử dụng Phương pháp thông dụng hay dùng hai cách tiếp cận đây: Cách tiếp cận thứ sử dụng kích thước (còn gọi rank), cách tiếp cận thứ hai sử dụng chiều sâu (còn gọi size) Cách thực hàm Union_set() dựa size cây: void make_set(int v) { parent[v] = v; size[v] = 1; } void union_set(int a, int b) { a = find_set(a); b = find_set(b); if (a != b) { if (size[a] < size[b]) swap(a, b); parent[b] = a; size[a] += size[b]; } } Cách thực hàm Union_set() dựa chiều sâu cây: void make_set(int v) { parent[v] = v; rank[v] = 0; } void union_set(int a, int b) { a = find_set(a); b = find_set(b); if (a != b) { if (rank[a] < rank[b]) swap(a, b); parent[b] = a; if (rank[a] == rank[b]) rank[a]++; } } Cả hai cách cài đặt yêu cầu nhớ độ phức tạp tương đương cài đặt dùng hai Độ phức tạp: Như đề cập trên, kết hợp hai giải pháp tối ưu nén lộ trình hợp size/rank đạt đến độ phức tạp số cho truy vấn Độ phức tạp truy vấn chứng O(α (n)), α (n) gần không lớn với giá trị n phù hợp (n ≤ 10600) 1.5 Áp dụng DSU giải tốn (*) Như trình bày mục 1.1.1 toán (*) giải với độ phức tạp O(q log( n)) giải pháp chưa tối ưu Sau tơi trình bày thuật tốn kết hợp với DSU để giảm độ phức tạp toán Thuật toán: Với truy vấn i=1 dùng hàm ¿ set ( ) với cách cài hợp size Với truy vấn i=2 dùng hàm Find set () với kĩ thuật nén lộ trình Độ phức tạp: Với kết hợp hai kĩ thuật cho thuật toán với độ phức tạp O(q α (n)) CHƯƠNG 2: ỨNG DỤNG CỦA DSU 2.1 Xác định quản lý thành phần liên thông đồ thị Đây ứng dụng phổ biến DSU Thơng thường tốn định nghĩa nhau: Ban đầu có đồ thị rỗng, phải thêm đỉnh cạnh vơ hướng trả lời truy vấn có dạng (a , b)-“các đỉnh a b có thành phần liên thông hay không?” 2.2 Xác định thành phần liên thơng ảnh Bài tốn: Có ảnh kích thước n × m điểm ảnh với hai màu trắng đen Hãy xác định kích thước thành phần liên thơng (các vùng ảnh có điểm ảnh màu đen) ảnh Thuật toán: Xét tất điểm ảnh đen, với điểm ảnh đen xét lân cận điểm ảnh lân cận điểm ảnh đen gọi hàm Union_set() Do đó, có DSU với n.m nút tương ứng với điểm ảnh Kết cuối ta thu rừng DSU mà thành phần liên thông rời rạc 2.3 Nén bước nhảy đoạn/Tơ màu dãy offline Bài tốn: Có tập đỉnh, đỉnh có đầu với đỉnh khác Với DSU tìm điểm cuối đường từ đỉnh bắt đầu qua tất cạnh thời gian số Một ví dụ cho ứng dụng tốn tơ màu cho dãy Chúng ta có dãy có độ dài L Ban đâu phần từ dãy tô màu Với truy vấn (l , r ,c ), ta tô lại màu cho đoạn [ l; r ] màu c Sau q truy vấn tìm màu cuối phần tử Thuật toán: Tạo DSU, phần tử tạo liên kết đến phần tử khác chưa tô màu, ban đầu phần từ liên kết với Khi đoạn tơ màu, tất đoạn liên kết đến sau đoạn Để giải tốn này, đảo ngược lại truy vấn từ cuối đến đầu Khi đó, với truy vấn ( l ,r , c ) ta phải tô màu ô đoạn [l , r ] chưa tô màu tất tơ màu màu cuối Để lặp lại nhanh ô chưa tô màu dùng DSU Chúng ta tìm bên trái đoạn [l , r ] chưa tô màu tơ màu cho Với trỏ, di chuyển ô trống kề tiếp sang bên phải Ở dùng DSU với nén lộ trình (path compression) khơng thể dùng Union by rank/size Do đó, độ phức tạp O(log (n)) cho Union_set Cài đặt: for (int i = 0; i = 0; i ) { int l = query[i].l; int r = query[i].r; int c = query[i].c; for (int v = find_set(l); v x mà chưa nhập vào x nhờ thao tác if (z>y) break; b[z-1]=z; 23 JoinA(z-1,z); x=z; } Nhắc lại hai hàm TimA TimB: int TimA(u) { if (a[u]==u) return u; a[u]=TimA(a[u]); return a[u]; } int TimB(u) { if (b[u]==u) return u; b[u]=TimB(b[u]); return b[u]; } Chương trình, test chấm: https://www.dropbox.com/sh/o5unxwd62o6zvh4/AAAiXpSZNl7wpHGoobi3 4Wara?dl=0 Bài Kho báu (Nguồn: FreeContest) Có N rương kho báu, rương thứ i có giá trị Ci Ban đầu, có K chìa khóa Chiếc chìa khóa thứ i dùng để mở hai rương Ai Bi (lưu ý dùng chìa thứ i để mở hai rương Ai Bi) Mỗi rương mở khóa lần, khơng thiết phải sử dụng tất chìa khóa Cho K truy vấn, truy vấn thứ i u cầu bỏ chìa khóa thứ Pi (các chìa khóa khơng đánh số lại sau truy vấn) Sau truy vấn, cho biết: giả sử ta dùng chìa khóa cịn lại để mở rương, với cách mở khóa rương tối ưu, tổng giá trị kho báu lớn thu từ rương mở Dữ liệu: Dòng gồm ba số nguyên N , K (2≤ N ≤200000 , ≤ K ≤ 200000) — số rương kho báu, số chìa khóa đồng thời số truy vấn Dòng tiếp theo, gồm N số nguyên C , C2 , ,C N (1≤ C i ≤ 10 ) — giá trị rương kho báu K dòng tiếp theo, dòng thứ i gồm hai số nguyên Ai Bi (1 ≤ Ai , B i ≤ N , A i ≠ B i) — mơ tả chìa khóa thứ i 24 Dòng tiếp theo, gồm K số nguyên phân biệt P1 , P2 , , P K (1 ≤ Pi ≤ K ) — mô tả truy vấn Kết quả: In K dòng, dòng thứi gồm số nguyên tổng giá trị kho báu lớn thu sau thực truy vấn thứ i Ví dụ: TREASURE.INP TREASURE.OUT 4 21 16 1 4 Giải thích: Sau truy vấn thứ nhất, lại chìa khóa 1, Ta dùng chìa để mở rương 2, chìa để mở rương chìa để mở rương Tổng giá trị rương mở 9+5+7=21 Sau truy vấn thứ hai, cịn lại chìa khóa Ta dùng chìa để mở rương 3, chìa để mở rương Tổng giá trị rương mở 9+7=16 Sau truy vấn thứ ba, cịn lại chìa khóa Ta dùng chìa khóa để mở rương với giá trị Sau truy vấn thứ tu, ta không cịn chìa khóa nên khơng mở rương kho báu Ràng buộc: Subtask (20% số điểm): N,K ≤16, Subtask (30% số điểm): N,K ≤2000, Subtask (50% số điểm): Không có ràng buộc thêm Thuật tốn: Trước hết, ta xét tốn tìm cách mở rương tối ưu với đầy đủ K chìa khố Ta cần xây dựng đồ thị N đỉnh, với đỉnh i đại diện cho rương 25 thứ i Với chìa khóa thứ i, ta thêm cạnh đỉnh Ai đỉnh Bi Ta xem việc dùng chìa khóa thứ i mở rương Ai hay Bi tương đương với việc định chiều cạnh i Khi đó, rương thứ i mở cạnh vào đỉnh i Khi đó, xét thành phần liên thông (TPLT): Nếu TPLT có tồn chu trình p1,p2, ,pk, ta định hướng cạnh chu trình theo chiều p1 → p2 → p3 → → pk → p1 Sau đó, ta dùng thuật tốn DFS, xuất phát từ đỉnh chu trình, ta thăm đỉnh v từ đỉnh u định hướng cạnh u → v Khi đó, đỉnh TPLT có cạnh vào Nếu TPLT khơng có chu tình, ta xuất phát từ đỉnh đại diện cho kho báu có giá trị thấp TPLT (gọi đỉnh r) thực thuật tốn DFS tương tự Khi đó, đỉnh TPLT trừ r có cạnh vào Do đó, đáp án tổng giá trị kho báu trừ tổng giá trị nhỏ kho báu TPLT Ta trở lại với toán ban đầu Thao tác xóa chìa khóa tương ứng với việc xóa cạnh đồ thị Ta thực truy vấn theo thứ tự ngược lại: ban đầu, đồ thị khơng có cạnh nào, truy vấn thêm cạnh vào đồ thị Khi đó, ta giải toán disjoint-set union (DSU) Với thành phần liên thông, ta lưu thêm thông tin đỉnh có giá trị nhỏ 26 TPLT, TPLT có chu trình hay khơng Các bạn xem giải mẫu để hiểu rõ chi tiết cài đặt Độ phức tạp: O(N + K logK) O(N + Kα(K)) (với α(K) nghịch đảo hàm Ackermann, xem số), tùy vào cách cài đặt DSU Chương trình, test chấm: https://www.dropbox.com/sh/o5unxwd62o6zvh4/AAAiXpSZNl7wpHGoobi34Wara?dl=0 3.3 Dạng tốn liên quan đến khung Bài Hệ thống điện (Nguồn: FreeContest) Đất nước Free Contest gồm N thành phố đánh số từ đến N Có M đường dây dẫn xây dựng được, đường dây dẫn thứ i kết nối hai thành phố U i V i với chi phí xây dựng Wi Chính phủ đất nước Free Contest có kế hoạch xây dựng lưới điện quốc gia để cung cấp điện cho toàn thành phố Họ dự định đặt hai trạm phát điện hai thành phố khác nhau, xây dựng số đường dây dẫn để thành phố cung cấp điện Một thành phố u cung cấp điện thành phố u đặt trạm phát điện, có đường dây dẫn nối thành phố u với thành phố khác cung cấp điện Chính phủ đề xuất Q phương án đặt hai trạm phát điện Với phương án thứ i, hai trạm phát điện đặt hai thành phố Aivà Bi Với phương án, họ cần tính tổng chi phí tối thiểu để xây dựng đường dây dẫn cho thành phố cung cấp điện Bạn, lập trình viên xuất sắc đất nước Free Contest, phủ tin cậy giao cho nhiệm vụ Hãy hồn thành cách xuất sắc nhé! Dữ liệu: Dòng gồm hai số nguyên N , M (1≤ N ≤ 4000 , ≤ M ≤ 400000) số thành phố đất nước Free Contest số đường dây dẫn xây dựng 27 M dòng tiếp theo, dòng gồm ba số nguyên U i , V i W i (1 ≤ U i , V i ≤ N , U i ≠ V i , 1≤ W i ≤10 9) mô tả đường dây dẫn thứ i Dữ liệu vào đảm bảo, xây dựng toàn M đường dây, từ thành phố truyền điện đến thành phố khác thông qua đường dây dẫn Dòng gồm số nguyên Q(1 ≤Q ≤ 200000) - số phương án phủ đề xuất Q dòng tiếp theo, dòng gồm hai số nguyên Ai Bi (1 ≤ Ai , B i ≤ N , A i ≠ B i) mô tả phương án thứ i Kết quả: Với phương án, in số nguyên tổng chi phí tối thiểu xây dựng đường dây dẫn cho thành phố cung cấp điện Ràng buộc: Subtask (10% số điểm): N , M ≤ 15 ,Q ≤100 Subtask (25% số điểm): Q=1 Subtask (40% số điểm): Q ≤3000 Subtask (25% số điểm): Không có ràng buộc thêm Ví dụ: ELECTRIC.INP ELECTRIC.OUT 14 13 3 4 4 5 Giải thích: 28 Hình vẽ minh họa ví dụ thứ (cạnh nét đứt biễu diễn đường dây dẫn xây dựng, cạnh nét liền biểu diễn đường dây dẫn cần xây dựng, đỉnh màu đen biểu diễn thành phố đặt trạm phát điện) Phương án thứ nhất: Phương án thứ hai: Thuật toán: Trước hết, với phương án đặt trạm điện hai thành phố A B, ta xem đặt trạm điện thành phố A, xây dựng đường dây điện nối A B với chi phí Từ đó, ta nghĩ thuật tốn cho hai subtask đầu tiên: bổ sung thêm cạnh ( A , B ,0) tìm khung cực tiểu (minimum spanning tree) đồ thị M + cạnh thuật tốn Kruskal Thuật tốn có độ phức tạp O(QM log(N + M)) Để cải tiến thuật toán trên, ta cần hiểu chất thuật toán Kruskal Trước hết, ta tìm khung cực tiểu T đồ thị M cạnh Nhận xét rằng, bổ sung cạnh có trọng số hai đỉnh A B, cạnh chắn nằm khung tối thiểu Khi đó, đường A B T cạnh ( A , B) tạo thành chu trình Do thuật tốn Kruskal xét cạnh theo trọng số từ nhỏ đến lớn, cạnh có trọng số lớn đường A B bị bỏ khỏi khung cực tiểu 29 Do đó, gọi W tổng trọng số cạnh T, maxW(u,v) cạnh có trọng số lớn đường u v T Khi đó, với truy ván i, đáp án W − maxW(Ai,Bi) Đến đây, ta có lời giải độ phức tạp O(M log(N + M) + QN), đủ để vượt qua subtask Để trọn vẹn điểm này, ta cần thực việc tính toán trước maxW(u,v) với cặp (u,v) O(N2) cách DFS từ đỉnh Khi đó, truy vấn trả lời O(1) Độ phức tạp: O(M log(N + M) + N2 + Q) Chương trình, test chấm: https://www.dropbox.com/sh/o5unxwd62o6zvh4/AAAiXpSZNl7wpHGoobi34Wara?dl=0 Bài Đơn giản hóa trang trại (Nguồn: FreeContest) Nông dân John (FJ) tham gia lớp học thuật toán buổi tối trường đại học gần nhà ông ta vừa học xong thuật tốn tìm khung có tổng trọng số nhỏ Chính vậy, FJ nhận thiết kế trạng trại khơng hiệu ơng ta muốn đơn giản hóa bố trí trang trại ông ta Trang trại xây dựng đồ thị với đỉnh đại diện cho cánh đồng cạnh đại diện cho đường cánh đồng, đường có độ dài xác định FJ ghi với độ dài khác có tối đa ba đường có độ dài FJ muốn bỏ số đường trang trại ông ta để trở thành - có nghĩa có đường hai cánh đồng Hơn FJ lại muốn trở thành khung có tổng trọng số nhỏ Hãy giúp FJ tính tốn tổng độ dài cạnh khung có tổng trọng số nhỏ xây dựng từ đồ thị tạo trang trại ông ta số cách khác để tạo khung Dữ liệu vào: 30 Dòng gồm hai số nguyên N , M (1≤ N ≤ 4.10 , 1≤ M ≤ 105) biểu diễn số đỉnh số cạnh đồ thị Các đỉnh đánh số từ đến N M dòng tiếp theo, dòng thứ ighi ba số a i , bi Li (1 ≤a i , bi ≤ N , ≤ Li ≤106 ) biểu thị có cạnh nối a i với b icó chiều dài Li Khơng có q ba cạnh có chiều dài Kết quả: Hai số nguyên Số thứ tổng trọng số khung nhỏ số thứ hai số lượng cách khác tạo khung nhỏ (chỉ lấy phần dư chia cho 109 +7) Ví dụ: SIMPLIFY.INP SIMPLIFY.OUT 3 1 2 Thuật toán: Bài toán giải đếm số khung tối tiểu khác Nhận xét giá trị khoảng cách có tối đa ba cạnh có độ dài Nên thuật toán Kruskal, ghi nhận giá trị có cạnh tham gia khung nhỏ Các trường hợp sau xảy ra: TH1: Giá trị có cạnh tham gia khung: Lần lượt thử Disjoint Set cạnh có giá trị cách độc lập để tạo khung Có lần thao tác nhập thực kết nhân lên nhiêu (1, 3) TH2: Giá trị có cạnh tham gia khung: Lấy tổ hợp chập số cạnh co giá trị thử Disjoint Set, có cặp tạo cuối nhân nhiêu (1, 3) TH3: Giá trị có cạnh tham gia khung: Nhân với Chương trình, test chấm: 31 https://www.dropbox.com/sh/o5unxwd62o6zvh4/AAAiXpSZNl7wpHGoobi34Wara?dl=0 3.4 Dạng khác Bài Tiệc khiêu vũ (Nguồn: Codefoce) Mehrad muốn mời số thiếu nữ đến cung điện để tham gia buổi khiêu vũ Mỗi thiếu nữ có cân nặng w i vẻ đẹp b i Mỗi thiếu nữ có vài người bạn riêng họ Những thiếu nữ chia thành nhóm bạn Thiếu nữ x thiếu nữ y chia vào nhóm tồn a , a2 , … , ak màa i và a i+1 bạn (1 ≤i S (i, k ) H (i , j)> H (i , k ) - Trong cột j(1 ≤ j ≤n), S (i, j)=S (k , j) H (i , j)=H (k , j) S(i , j)> S (k , j) H (i , j)> H ( k , j) Yêu cầu: Cho chiều cao ảo tất ô, nhiệm vụ bạn xác định số lượng mức chiều cao thực khác Dữ liệu đầu vào: Dòng chứa hai số nguyên dương: m n, tương ứng với số lượng hàng cột (m ×n ≤ 106) Dòng thứ i m hàng chứa n số nguyên dương H (i , j)≤10 tương ứng với chiều cao ảo ô hàng thứ i Kết quả: Đưa số nguyên số số lượng mức chiều cao thực khác phịng VR Thuật tốn: Trước hết, ta gộp có giá trị giống dòng cột vào thành phần liên thơng (ta gọi siêu đỉnh) Việc tìm cặp ô để gộp thực cách duyệt dịng, xếp dịng theo thứ tự tăng dần, thêm cạnh hai ô cột j cột j+1 34 dòng số hai ô (Với cột làm tương tự) Việc gộp làm DSU DFS Sau đó, ta duyệt dịng, xếp dịng theo thứ tự tăng dần, thêm cạnh chiều nối từ siêu đỉnh chứa ô cột j đến siêu đỉnh chứa cột j+1 dịng số cột j nhỏ số côt j+1 Ta làm tương tự với cột Cuối cùng, ta DAG siêu đỉnh Đáp số cần tìm số đỉnh đường dài DAG Bài tốn tìm độ dài đường dài DAG tốn quy hoạch động kinh điển, giải O(N+M) (với N số đỉnh DAG, M số cạnh DAG) Độ phức tạp: O(N*M*log(N+M)) Chấm tại: https://hochiminh17.kattis.com/problems/heightpreservation PHẦN III: KẾT LUẬN Disjoint – Set – Union cấu trúc liệu sử dụng phổ biến toán Tin học thi HSG Quốc gia, ACM,… đặc biệt toán liên quan đến đồ thị Những kĩ thuật cải tiến DSU giúp trả lời truy vấn: hai phần tử có thuộc tập hợp hay không, kết hợp tập hợp rời độ phức tạp O ( logn ) ,O(α ( n)) Trong chun đề này, tơi trình bày nội dung lý thuyết nhất, số ứng dụng phổ biến DSU Đặc biệt số lớp toán thể rõ tầm quan DSU Trong thời gian tới hy vọng nhận đóng góp quý giá quý Thầy Cô, đồng nghiệp để viết ngày tốt PHẦN IV: TÀI LIỆU THAM KHẢO: [1] Hồ Sĩ Đàm, Đỗ Đức Đơng, Lê Minh Hồng, Nguyễn Thanh Tùng, “Tài liệu chuyên tin – 1, 2, 3”, NXB Giáo dục Việt Nam, 2009 [2] Lê Minh Hoàng, “Cấu trúc liệu giải thuật”, NXB Đại học Sư Phạm 35 Hà Nội, 1999 - 2004 [4] Lê Minh Hoàng, “Bài giảng Trại hè Tin học”, THPT chuyên Bắc Ninh , 2017 [5] https://cp-algorithms.com/data_structures/disjoint_set_union.html [6] https://kupc2017.contest.atcoder.jp/tasks/kupc2017_e [7] https://atcoder.jp/contests/cf16-tournament-round1-open/tasks/asaporo_c [8] https://www.geeksforgeeks.org/union-find/ ... ngày nâng cao độ khó thuật tốn cấu trúc liệu Có nhiều cấu trúc liệu nâng cao ngày xuất nhiều đề thi Trong đó, cấu trúc liệu Disjoint – Set - Union (DSU) cấu trúc liệu quan trọng Tuy nhiên, Tài liệu. .. tơi trình bày cấu trúc liệu Disjoint – Set – Union (DSU) thực toán với độ phức tạp O(q log( n)) O(q α (n)) 4 1.2 Định nghĩa Trong khoa học máy tính, Cấu trúc liệu Disjoint – Set - Union (hợp... nhau) cấu trúc liệu quản lý phần tử phân chia thành tập không giao DSU cung cấp phép toán: thêm tập mới, kết hợp tập lại với nhau, xác định phần tử có tập hợp hay không Cấu trúc liệu Disjoint – Set