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.
Đại họcĐịnh nghĩa chính xác
Định nghĩa: Cây
Một cây là một đồ thị 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 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.
Đây là cân bằng đặc trưng của cây: với đỉnh, một cây có đúng 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 () cho một đẳng thức đồng hành hữu ích khi đếm số lá và đỉnh trong.
| Điều kiện | Số cạnh | Tính chất thêm |
|---|---|---|
| Liên thông và không có chu trình | đúng | đường đi duy nhất giữa mọi cặp đỉnh |
| Liên thông với cạnh | bỏ 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 cạnh | thê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 cạnh (không phải cây) | vẫ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ị có đỉnh, các mệnh đề sau tương đương: (i) liên thông và không có chu trình; (ii) liên thông với cạnh; (iii) không có chu trình với 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 (ii) liên thông với cạnh (iii) không có chu trình với cạnh (i), khép kín cả ba điều kiện.
**(i)(ii)**, bằng quy nạp theo . Trường hợp cơ sở hiển nhiên: một đỉnh đơn có cạnh. Ở bước quy nạp, xét một đồ thị liên thông không có chu trình trên đỉnh. Vì hữu hạn và không có chu trình, nó phải chứa một lá (đỉnh bậc ): nếu không, mọi đỉnh sẽ có bậc , 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 và cạnh duy nhất kề nó để lại một đồ thị trên đỉnh vẫn liên thông ( 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, có cạnh, nên có cạnh.
**(ii)(iii)**. Giả sử liên thông với cạnh. Nếu 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 đỉnh chỉ với cạnh. Nhưng bất kỳ đồ thị liên thông nào trên đỉnh cũng cần ít nhất 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 cạnh không thể nối liên thông đỉnh — mâu thuẫn. Vậy không có chu trình nào, tức không có chu trình.
**(iii)(i)**. Giả sử không có chu trình với cạnh, và có 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)(ii) áp dụng riêng cho từng thành phần, một thành phần với đỉnh có cạnh. Cộng trên mọi thành phần, tổng số cạnh là . Vì tổng cho trước là , ta có , nên : liên thông.
Số cây có nhãn khác nhau trên tập đỉnh (với ) là .
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 đ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 và, với , định nghĩa dãy Prüfer của một cây có nhãn : 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 đỉnh. Điều này ghi lại nhãn (mỗi lần xóa một nhãn, vì ta bắt đầu với đỉnh và dừng ở ), nên mỗi cây có nhãn tạo ra một dãy trong .
Có đúng dãy như vậy, vì mỗi vị trí trong vị trí độc lập nhận bất kỳ nhãn nào trong 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 xuất hiện đúng lần: mỗi khi một đỉnh kề của bị xóa với vai trò lá, nhãn được ghi một lần, và bản thân 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 , 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ả mục đã dùng hết, nối 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 đỉnh và các dãy trong . Vì có dãy như vậy, có đúng cây có nhãn trên đỉ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à: , , , , , , , . 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 liên kết ứng viên theo chiều dài tăng dần: , , , , , , , . 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 (tháp trước đó tách rời, nay được nối). Thêm (nối tháp vào nhóm , nay là ). Thêm (tháp trước đó tách rời, nay được nối thành ).
Bỏ qua : cả và đã ở trong nhóm , nên thêm liên kết này sẽ tạo chu trình. Thêm : nối hai nhóm còn lại và thành một nhóm gồm cả tháp.
Tới đây liên kết đã được thêm, khớp với cạnh cho một cây trên đỉ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à 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 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 đỉnh là . Ở đây , nên số lượng là .
Tính ra, . Vậy có cấu trúc cây khác nhau về mặt cấu trúc nối 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ả 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 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ó đỉ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 đỉnh?
Một công ty cáp phải nối 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ó đỉnh và cạnh, nhưng bị chia thành 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 ?
Tài liệu tham khảo
- Reinhard Diestel (2017). Graph Theory
- 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
- Aaron Schild (2017). An almost-linear time algorithm for uniform random spanning tree generation · arXiv:1711.06455 [preprint, chưa bình duyệt]