Vấn đề này nhắc nhở tôi rất nhiều cây quyết định. Tôi sẽ xem xét loại giải pháp này, nó luôn cố gắng chọn con đường hứa hẹn nhất, nhưng bằng cách nhìn vào toàn bộ sơ đồ con:
Bắt đầu từ các nút chìm, làm việc theo cách của bạn đối với các nguồn, mỗi lần một cấp. Trong khi bạn làm điều này, cung cấp cho mỗi cạnh một trọng lượng. Trọng lượng này sẽ đại diện cho số tiền tối thiểu bạn sẽ phải "trả" hoặc bạn sẽ "đạt được" bằng cách duyệt qua sơ đồ con bắt đầu từ nút mà các cạnh chỉ đến. Giả sử chúng ta đang ở cấp i + 1 và chúng ta đang tiến lên cấp i. Đây là những gì tôi sẽ làm để gán trọng số cho cạnh chỉ vào nút cấp i:
- edge_ weight = trỏ_node_ weight.
- Tìm cạnh bắt đầu từ "nút trỏ" với trọng lượng tối đa. Đặt trọng lượng này là next_edge_ weight.
- edge_ weight + = next_edge_ weight
Sau đó, xây dựng thứ tự như sau:
- Đặt S là biên giới tìm kiếm, tức là tập hợp các nút để chọn tiếp theo.
- Chọn nút sao cho (node_ weight + Maximum_edge_ weight) được tối đa hóa.
- Xóa nút khỏi biểu đồ và S. Thêm "con" của nút vào S.
- Nếu biểu đồ không trống, chuyển sang bước 1.
- Tạm dừng lại.
Ý tưởng là đi qua các sơ đồ con sẽ mang lại mức tăng càng nhiều càng tốt trước tiên, để có thể chịu chi phí cho các sơ đồ khối lượng âm sau này.