MathLabs

Tổ hợp và Toán rời rạc

Cây

Đồ thị liên thông không có chu trình, dạng mạng đơn giản và có cấu trúc nhất.

Trực giácMạng không có đường vòng

Cây gia phả, sơ đồ tổ chức của một công ty, hệ thống tệp máy tính, và cây quyết định trong một trò chơi đều có cùng một hình dạng: mọi hai điểm đều được nối bởi đúng một đường đi, không có vòng lặp nào để bị lạc vào. Thêm một liên kết nữa giữa hai nhánh của cây gia phả và bạn tạo ra một chu trình — một đường tắt phá vỡ tính chất "đúng một đường đi" này. Cây là tên gọi toán học cho một mạng liên thông với số cạnh ít nhất có thể: bỏ đi bất kỳ một cạnh nào thì nó vỡ thành hai mảnh; thêm bất kỳ một cạnh nào thì nó tạo ra một chu trình.

Đồ thị đầy đủ trên 4 đỉnh với mỗi đỉnh được tô màu khác nhau, dùng để minh họa cây khung và công thức Cayley.
Cây nhị phân T3T_3 trên V=7V = 7 đỉnh có đúng E=V−1=6E = V - 1 = 6 cạnh, không có chu trình, và có duy nhất một đường đi đơn giữa hai đỉnh bất kỳ.

Đại họcĐịnh nghĩa chính xác

Định nghĩa: Cây

Một cây là một đồ thị TT vừa liên thông (có đường đi giữa mọi cặp đỉnh) vừa không có chu trình (không chứa chu trình nào). Một đỉnh bậc 11 trong cây được gọi là một lá. Một đồ thị mà mọi thành phần liên thông đều là cây (nên bản thân nó không cần liên thông) được gọi là một rừng.

∣V(T)∣=n  ⟹  ∣E(T)∣=n−1|V(T)| = n \implies |E(T)| = n - 1

Đây là cân bằng đặc trưng của cây: với nn đỉnh, một cây có đúng n−1n-1 cạnh — vừa đủ để giữ mọi thứ liên thông, không dư ra để tạo chu trình nào. Cộng bậc trên tất cả các đỉnh và dùng bổ đề bắt tay (∑vdeg⁡(v)=2∣E∣\sum_v \deg(v) = 2|E|) cho một đẳng thức đồng hành hữu ích khi đếm số lá và đỉnh trong.

∑v∈V(T)deg⁡(v)=2(n−1)\sum_{v \in V(T)} \deg(v) = 2(n-1)
Các cách tương đương để đặc trưng một cây trên nn đỉnh
Điều kiệnSố cạnhTính chất thêm
Liên thông và không có chu trìnhđúng n−1n-1đường đi duy nhất giữa mọi cặp đỉnh
Liên thông với n−1n-1 cạnhn−1n-1bỏ bất kỳ cạnh nào cũng làm mất liên thông
Không có chu trình với n−1n-1 cạnhn−1n-1thêm bất kỳ cạnh nào cũng tạo đúng một chu trình
Đồ thị không liên thông với n−1n-1 cạnh (không phải cây)n−1n-1vẫn có chu trình ở đâu đó dù số cạnh khớp

Đại họcCác định lý chính

Với một đồ thị TT có nn đỉnh, các mệnh đề sau tương đương: (i) TT liên thông và không có chu trình; (ii) TT liên thông với n−1n-1 cạnh; (iii) TT không có chu trình với n−1n-1 cạnh.

Vì sao đúng?

Bỏ bất kỳ cạnh nào khỏi một cây cũng làm mất liên thông, và thêm bất kỳ cạnh nào cũng tạo ra một chu trình — một cây có đúng số cạnh cần thiết để nối mọi thứ, không dư không thiếu. Ba điều kiện này mỗi cái chốt lại cấu trúc "vừa đủ" đó từ một góc nhìn khác nhau.

Chứng minh

Ta chỉ ra (i) liên thông và không có chu trình   ⟹  \implies (ii) liên thông với n−1n-1 cạnh   ⟹  \implies (iii) không có chu trình với n−1n-1 cạnh   ⟹  \implies (i), khép kín cả ba điều kiện.

**(i)  ⟹  \implies(ii)**, bằng quy nạp theo nn. Trường hợp cơ sở n=1n=1 hiển nhiên: một đỉnh đơn có 0=n−10 = n-1 cạnh. Ở bước quy nạp, xét một đồ thị liên thông không có chu trình TT trên n≥2n\ge2 đỉnh. Vì TT hữu hạn và không có chu trình, nó phải chứa một lá vv (đỉnh bậc 11): nếu không, mọi đỉnh sẽ có bậc ≥2\ge 2, và đi theo các cạnh từ một đỉnh xuất phát bất kỳ mà không quay lại ngay sẽ cuối cùng thăm lại một đỉnh, tạo ra chu trình. Xóa vv và cạnh duy nhất kề nó để lại một đồ thị T′T' trên n−1n-1 đỉnh vẫn liên thông (vv không có đỉnh nào khác phụ thuộc vào nó để giữ liên thông) và vẫn không có chu trình (đồ thị con của một đồ thị không có chu trình cũng không có chu trình). Theo giả thiết quy nạp, T′T' có (n−1)−1(n-1)-1 cạnh, nên TT có (n−1)−1+1=n−1(n-1)-1+1 = n-1 cạnh.

**(ii)  ⟹  \implies(iii)**. Giả sử TT liên thông với n−1n-1 cạnh. Nếu TT có một chu trình, xóa một cạnh của chu trình đó sẽ giữ đồ thị liên thông (hai đầu mút của cạnh bị xóa vẫn được nối bởi phần còn lại của chu trình), cho một đồ thị liên thông trên nn đỉnh chỉ với n−2n-2 cạnh. Nhưng bất kỳ đồ thị liên thông nào trên nn đỉnh cũng cần ít nhất n−1n-1 cạnh (mỗi đỉnh mới ngoài đỉnh đầu tiên cần ít nhất một cạnh mới để tới được), nên n−2n-2 cạnh không thể nối liên thông nn đỉnh — mâu thuẫn. Vậy TT không có chu trình nào, tức không có chu trình.

**(iii)  ⟹  \implies(i)**. Giả sử TT không có chu trình với n−1n-1 cạnh, và có cc thành phần liên thông. Mỗi thành phần tự nó liên thông và không có chu trình, nên theo chiều đã chứng minh (i)  ⟹  \implies(ii) áp dụng riêng cho từng thành phần, một thành phần với nin_i đỉnh có ni−1n_i - 1 cạnh. Cộng trên mọi thành phần, tổng số cạnh là ∑i(ni−1)=n−c\sum_i (n_i - 1) = n - c. Vì tổng cho trước là n−1n-1, ta có n−c=n−1n - c = n - 1, nên c=1c=1: TT liên thông.

Định lý: Công thức Cayley

Số cây có nhãn khác nhau trên tập đỉnh {1,…,n}\{1,\dots,n\} (với n≥2n\ge2) là nn−2n^{n-2}.

Vì sao đúng?

Nó trả lời một câu hỏi tổ hợp thuần túy — có bao nhiêu cách khác nhau để nối nn điểm phân biệt thành một mạng dạng cây — bằng một công thức đóng đơn giản đến bất ngờ, và thủ thuật mã hóa dùng để chứng minh nó (dãy Prüfer) biến "đếm số cây" thành "đếm số dãy," một bài toán dễ hơn nhiều.

Chứng minh

Cố định tập đỉnh {1,…,n}\{1,\dots,n\} và, với n≥2n\ge2, định nghĩa dãy Prüfer của một cây có nhãn TT: lặp lại việc tìm lá có nhãn nhỏ nhất, ghi lại nhãn của đỉnh kề duy nhất của nó, rồi xóa lá đó; dừng khi còn lại 22 đỉnh. Điều này ghi lại n−2n-2 nhãn (mỗi lần xóa một nhãn, vì ta bắt đầu với nn đỉnh và dừng ở 22), nên mỗi cây có nhãn tạo ra một dãy trong {1,…,n}n−2\{1,\dots,n\}^{n-2}.

Có đúng nn−2n^{n-2} dãy như vậy, vì mỗi vị trí trong n−2n-2 vị trí độc lập nhận bất kỳ nhãn nào trong nn nhãn. Còn phải chỉ ra phép mã hóa này là một song ánh, để các cây có nhãn tương ứng đúng một-một với các dãy này.

Sự kiện then chốt là trong dãy Prüfer, nhãn ii xuất hiện đúng deg⁡(i)−1\deg(i)-1 lần: mỗi khi một đỉnh kề của ii bị xóa với vai trò lá, nhãn ii được ghi một lần, và bản thân ii chỉ bị xóa (không đóng góp lần ghi nào) khi tất cả trừ một cạnh kề của nó đã mất. Đặc biệt, các nhãn không bao giờ xuất hiện trong dãy chính là các lá ban đầu. Điều này cho phép ta giải mã: cho một dãy (a1,…,an−2)(a_1,\dots,a_{n-2}), lặp lại việc lấy nhãn nhỏ nhất chưa được dùng làm một mục còn lại trong dãy hoặc đã được gắn, nối nó bằng một cạnh với mục đầu tiên còn lại trong dãy, loại nhãn đó khỏi các xét tiếp theo và bỏ mục đó khỏi dãy; sau khi cả n−2n-2 mục đã dùng hết, nối 22 nhãn còn sót lại bằng một cạnh cuối cùng.

Quy trình giải mã này đảo ngược chính xác từng bước quá trình mã hóa — ở mỗi giai đoạn nó xác định đúng lá có nhãn nhỏ nhất và đỉnh kề mà bộ mã hóa lẽ ra đã ghi lại, theo quy nạp trên số đỉnh còn lại. Vậy mã hóa và giải mã là nghịch đảo của nhau, cho một song ánh giữa các cây có nhãn trên nn đỉnh và các dãy trong {1,…,n}n−2\{1,\dots,n\}^{n-2}. Vì có nn−2n^{n-2} dãy như vậy, có đúng nn−2n^{n-2} cây có nhãn trên nn đỉnh.

Đại họcỨng dụng thực tiễn và Ví dụ minh họa

Cây là xương sống của các cấu trúc phân cấp và định tuyến ở khắp nơi: hệ thống tệp, cây phát sinh loài trong sinh học, cây quyết định trong học máy, và cây tìm kiếm nhị phân cùng mã Huffman trong khoa học máy tính. Một trong những ứng dụng kỹ thuật trực tiếp nhất là thiết kế mạng: khi một công ty cần nối một tập văn phòng, cảm biến, hay máy tính bằng cáp hay liên kết không dây với chi phí thấp nhất, cách bố trí liên thông rẻ nhất luôn là một cây khung — nối chúng bằng một chu trình sẽ lãng phí tiền vào một liên kết dư thừa. Thuật toán Kruskal tìm cây rẻ nhất này bằng một quy tắc tham lam đơn giản: sắp xếp mọi liên kết khả dĩ theo chi phí, và thêm từng cái theo thứ tự trừ khi nó tạo ra một chu trình.

Ví dụ: Đi cáp chi phí thấp nhất qua thuật toán Kruskal

Năm tháp tiếp sóng cần được nối bằng cáp quang với tổng chiều dài nhỏ nhất. Các liên kết khả dĩ và chiều dài của chúng (km) là: {1,3}:1\{1,3\}:1, {2,3}:2\{2,3\}:2, {4,5}:2\{4,5\}:2, {1,2}:4\{1,2\}:4, {2,4}:5\{2,4\}:5, {2,5}:6\{2,5\}:6, {3,4}:8\{3,4\}:8, {3,5}:10\{3,5\}:10. Tìm tổng chiều dài cáp nhỏ nhất cần để nối cả năm tháp.

Lời giải

Sắp xếp 88 liên kết ứng viên theo chiều dài tăng dần: {1,3}:1\{1,3\}:1, {2,3}:2\{2,3\}:2, {4,5}:2\{4,5\}:2, {1,2}:4\{1,2\}:4, {2,4}:5\{2,4\}:5, {2,5}:6\{2,5\}:6, {3,4}:8\{3,4\}:8, {3,5}:10\{3,5\}:10. Thuật toán Kruskal quét danh sách này một lần, thêm một liên kết trừ khi cả hai đầu mút của nó đã liên thông bởi các liên kết đã chọn trước đó (điều này sẽ tạo chu trình).

Thêm {1,3}:1\{1,3\}:1 (tháp 1,31,3 trước đó tách rời, nay được nối). Thêm {2,3}:2\{2,3\}:2 (nối tháp 22 vào nhóm {1,3}\{1,3\}, nay là {1,2,3}\{1,2,3\}). Thêm {4,5}:2\{4,5\}:2 (tháp 4,54,5 trước đó tách rời, nay được nối thành {4,5}\{4,5\}).

Bỏ qua {1,2}:4\{1,2\}:4: cả 11 và 22 đã ở trong nhóm {1,2,3}\{1,2,3\}, nên thêm liên kết này sẽ tạo chu trình. Thêm {2,4}:5\{2,4\}:5: nối hai nhóm còn lại {1,2,3}\{1,2,3\} và {4,5}\{4,5\} thành một nhóm gồm cả 55 tháp.

Tới đây 44 liên kết đã được thêm, khớp với n−1=5−1=4n-1 = 5-1=4 cạnh cho một cây trên 55 đỉnh, nên thuật toán dừng (mọi liên kết sau đó chỉ tạo chu trình). Tổng chiều dài cáp nhỏ nhất là 1+2+2+5=101+2+2+5 = 10 km.

Ví dụ: Đếm số cấu trúc xương sống có thể có

Một công ty viễn thông dự định nối 66 trạm tiếp sóng phân biệt bằng một mạng xương sống dạng cây, không vòng lặp, chưa có ràng buộc về cặp nào được nối. Có bao nhiêu cấu trúc cây có nhãn khác nhau về mặt cấu trúc là khả dĩ?

Lời giải

Theo công thức Cayley, số cây có nhãn trên nn đỉnh là nn−2n^{n-2}. Ở đây n=6n=6, nên số lượng là 66−2=646^{6-2} = 6^4.

Tính ra, 64=6×6×6×6=12966^4 = 6\times6\times6\times6 = 1296. Vậy có 12961296 cấu trúc cây khác nhau về mặt cấu trúc nối 66 trạm.

Với một người lập kế hoạch mạng, không gian thiết kế khổng lồ này chính là lý do không ai liệt kê cả 12961296 khả năng bằng tay: thay vào đó, một quy trình tối ưu như thuật toán Kruskal (tính chất đếm cạnh ở Định lý 1 đảm bảo mọi ứng viên đều có đúng 6−1=56-1=5 liên kết) chọn ra trực tiếp một cây rẻ nhất từ chi phí các liên kết, mà không cần liệt kê các cây còn lại.

Một cây có 2323 đỉnh. Nó có bao nhiêu cạnh?

Theo công thức Cayley, có bao nhiêu cây có nhãn khác nhau trên 55 đỉnh?

Một công ty cáp phải nối 99 văn phòng bằng mạng rẻ nhất có thể (không có liên kết dư thừa). Dùng thuật toán Kruskal trên chi phí liên kết đã sắp xếp, mạng cuối cùng sẽ có bao nhiêu liên kết?

Một đồ thị có 1010 đỉnh và 99 cạnh, nhưng bị chia thành 22 mảnh liên thông riêng biệt (một trong số đó chứa một chu trình). Đồ thị này không thỏa đặc trưng nào trong Định lý 1, dù số cạnh của nó khớp với n−1n-1?

Tài liệu tham khảo

  1. Reinhard Diestel (2017). Graph Theory
  2. David R. Karger, Philip N. Klein, Robert E. Tarjan (1995). A randomized linear-time algorithm to find minimum spanning trees · DOI:10.1145/201019.201022
  3. Aaron Schild (2017). An almost-linear time algorithm for uniform random spanning tree generation · arXiv:1711.06455 [preprint, chưa bình duyệt]