Review in round 1 Câu C
Tóm tắt đề bài: Cho đồ thị vô hướng (cây) . Tìm đường đi (mỗi đỉnh đi qua đúng một lần) có tích số nhỏ nhất, với tích số của đường đi được tính bằng tích trọng số các nút của đường đi chia số nút trên đường đi.
Ta sẽ tạm gọi các đỉnh có trọng số là đỉnh , và các đỉnh có trọng số lớn hơn là đỉnh . Ta nhận thấy rằng đường đi tối ưu nhất chỉ chứa tối đa đỉnh .
Nếu không có đỉnh , đường đi có tích số nhỏ nhất cần tìm chỉ có một đỉnh với giá trị trọng số nhỏ nhất. Ngược lại, đường đi cần tìm thuộc vào một trong hai dạng theo thứ tự duyệt:
Dạng : Đường đi bao gồm đỉnh , tích số .
Dạng : Đường đi bao gồm đỉnh , một đỉnh và đỉnh , tích số
Ta dễ dàng suy ra rằng để tìm được phương án tối ưu, ta cần đi qua càng nhiều đỉnh càng tốt.
Xét ví dụ sau như hình vẽ :
Với dạng thứ nhất, ta chỉ đi qua các đỉnh , vì vậy ta có thể biến đổi bằng cách tạm thời xóa đi những cạnh nối hoặc . Ta có hình vẽ .
Do có đúng cạnh nên bị chia thành các thành phần liên thông (cây con), với ví dụ trên ta sẽ tạm gọi các thành phần liên thông (cây con) chỉ chứa đỉnh là: cây , cây và cây (tương ứng với số đỉnh).
Lúc này, đường đi chỉ có thể thuộc một trong các cây con. Với mỗi cây con, số đỉnh nhiều nhất có thể đi qua chính là đường kính của cây đó (Các bạn có thể tham khảo định nghĩa, tính chất và thuật toán tìm đường kính tại đây).
Ta dễ dàng có được bằng độ dài đường kính lớn nhất trong số các cây con. Trong ví dụ trên, là đường kính của cây .
Sau khi có được thuật toán cho dạng thứ nhất, ta có thể đưa ra được ý tưởng cho dạng đường đi thứ hai: Kết nối hai cây con thông qua một "khớp nối" là đỉnh .
Mỗi đỉnh là "khớp nối" nếu có cạnh nối với đỉnh (). Vì có số cạnh nên đỉnh kết nối cây con. Đường đi dạng thứ hai bao gồm đỉnh và hai nhánh thuộc hai trong số cây con.
Trong ví dụ trên, đường đi dạng thứ hai tối ưu nhất có tích số , trong đó có hai đỉnh thuộc cây con và ba đỉnh thuộc cây con .
Vậy tóm lại, ta cần làm như sau:
Tìm các cây con chỉ chứa đỉnh .
Tìm đường kính lớn nhất trong số các cây con để tối ưu đường đi dạng thứ nhất.
Duyệt qua với mỗi đỉnh , tìm hai nhánh có độ dài lớn nhất để tối ưu đường đi dạng thứ hai.
Kết quả là giá trị tích số nhỏ nhất trong hai dạng đường đi.
Độ phức tạp: . Code tham khảo
Comments