2.16 ✅ Hợp nhất - tìm đại diện (Union Find)

  • Dùng linh hoạt tư duy Union Find / DSU và nắm vững template. Trong template có 2 cách triển khai:
    • Path compression + union by rank
    • Đếm số phần tử trong mỗi tập + kích thước tập lớn nhất Mỗi phiên bản phù hợp với từng dạng bài khác nhau.
    • Dạng 1 dùng tốt cho các bài: 128, 130, 547, 684, 721, 765, 778, 839, 924, 928, 947, 952, 959, 990.
    • Dạng 2 dùng tốt cho các bài: 803, 952. (Bài 803 rất dễ TLE nếu không tối ưu rank/đếm tập.)
  • Union Find là một tư duy, không phải lúc nào cũng “nhét template” là xong. Ví dụ bài 399 có thể làm theo kiểu stringUnionFind: mỗi node là chuỗi + map, không chỉ đánh số node bằng int.
  • Có bài nếu áp template “cứng” lại không ra. Ví dụ bài 685 không nên dùng path compression/union by rank vì liên quan đồ thị có hướng và cần biết tiền nhiệm của node; nén đường đi sẽ làm mất thông tin cần thiết.
  • Biết cách trừu tượng dữ liệu đề bài và đánh số hợp lý, kết hợp map để giảm thời gian (ví dụ bài 721, 959).
  • Với các bài dạng bản đồ/gạch/lưới, có thể thêm một node đặc biệtunion() toàn bộ ô ở biên vào node này (ví dụ bài 130, 803).
  • Nhiều bài dùng Union Find cũng có thể giải bằng DFS/BFS, nhưng thường tốn thời gian hơn.
STTTiêu đềLời giảiĐộ khóĐộ phức tạp thời gianĐộ phức tạp bộ nhớYêu thíchTỷ lệ AC (Acceptance)
0128Dãy liên tiếp dài nhất (Longest Consecutive Sequence)GoMediumO(n)O(n)❤️48.5%
0130Vùng bị bao quanh (Surrounded Regions)GoMediumO(m*n)O(m*n)36.7%
0200Số lượng hòn đảo (Number of Islands)GoMediumO(m*n)O(m*n)57.0%
0399Tính giá trị phép chia (Evaluate Division)GoMediumO(n)O(n)59.6%
0547Số lượng tỉnh thành (Number of Provinces)GoMediumO(n^2)O(n)63.7%
0684Kết nối dư thừa (Redundant Connection)GoMediumO(n)O(n)62.2%
0685Kết nối dư thừa II (Redundant Connection II)GoHardO(n)O(n)34.1%
0695Diện tích đảo lớn nhất (Max Area of Island)GoMedium71.8%
0721Gộp tài khoản (Accounts Merge)GoMediumO(n)O(n)❤️56.3%
0765Các cặp đôi nắm tay (Couples Holding Hands)GoHardO(n)O(n)❤️56.6%
0778Bơi trong nước dâng (Swim in Rising Water)GoHardO(n^2)O(n)❤️59.8%
0785Đồ thị có phải lưỡng phân không? (Is Graph Bipartite?)GoMedium53.1%
0803Gạch rơi khi bị đánh (Bricks Falling When Hit)GoHardO(n^2)O(n)❤️34.4%
0839Nhóm chuỗi tương tự (Similar String Groups)GoHardO(n^2)O(n)48.0%
0924Giảm thiểu lây lan mã độc (Minimize Malware Spread)GoHardO(m*n)O(n)42.1%
0928Giảm thiểu lây lan mã độc II (Minimize Malware Spread II)GoHardO(m*n)O(n)❤️42.7%
0947Loại bỏ nhiều đá nhất với cùng hàng hoặc cột (Most Stones Removed with Same Row or Column)GoMediumO(n)O(n)58.9%
0952Kích thước thành phần lớn nhất theo ước chung (Largest Component Size by Common Factor)GoHardO(n)O(n)❤️40.0%
0959Các vùng bị cắt bởi dấu gạch chéo (Regions Cut By Slashes)GoMediumO(n^2)O(n^2)❤️69.1%
0990Khả năng thỏa mãn các phương trình đẳng thức (Satisfiability of Equality Equations)GoMediumO(n)O(n)50.5%
1020Số lượng vùng đất bị cô lập (Number of Enclaves)GoMedium65.5%
1202Chuỗi nhỏ nhất sau khi hoán đổi (Smallest String With Swaps)GoMedium57.7%
1254Số lượng đảo khép kín (Number of Closed Islands)GoMedium64.1%
1319Số thao tác để kết nối mạng (Number of Operations to Make Network Connected)GoMedium62.1%
1579Loại bỏ tối đa số cạnh để đồ thị vẫn duyệt được hoàn toàn (Remove Max Number of Edges to Keep Graph Fully Traversable)GoHard53.2%
1631Đường đi với nỗ lực tối thiểu (Path With Minimum Effort)GoMedium55.7%
------------------------------------------------------------------------------------------------------------------------------------------------