Giả sử, chúng ta có N mục, được đánh dấu là 0, 1, 2,…, N-1. Sau đó, chúng ta được cung cấp một danh sách 2D có kích thước S được gọi là các tập hợp. Tại đây, chúng tôi có thể mua bộ thứ i với các bộ giá [i, 2] và chúng tôi nhận được mọi mặt hàng giữa các bộ [i, 0] đến các bộ [i, 1]. Ngoài ra, chúng tôi có một danh sách kích thước N được gọi là loại bỏ, nơi chúng tôi có thể loại bỏ 1 phiên bản của phần tử thứ i cho các lần xóa giá [i]. Vì vậy, chúng tôi phải tìm ra chi phí tối thiểu để mua chính xác một trong mọi phần tử từ 0 đến N-1, hoặc kết quả là -1 nếu điều này không thể thực hiện được.
Vì vậy, nếu đầu vào giống như các bộ =[[0, 4, 4], [0, 5, 12], [2, 6, 9], [4, 8, 10]]
Removal =[2, 5, 4, 6, 8], thì kết quả đầu ra sẽ là 4.
Để giải quyết vấn đề này, chúng tôi sẽ làm theo các bước sau -
-
N:=kích thước của lần xóa
-
graph:=một ma trận mới cho kích thước (N + 1) x (N + 1)
-
cho mỗi s, e, w trong bộ, làm
-
thêm [e + 1, w] vào biểu đồ [s]
-
-
đối với mỗi mục i, r trong chỉ mục i và mục r trong mục xóa, hãy thực hiện
-
thêm [i, r] vào biểu đồ [i + 1]
-
-
pq:=a new heap
-
dist:=một bản đồ mới
-
dist [0]:=0
-
trong khi pq không trống, thực hiện
-
d, e:=loại bỏ mục nhỏ nhất khỏi heap pq
-
nếu dist [e]
-
tiếp tục lần lặp tiếp theo
-
-
nếu e giống N thì
-
trở lại d
-
-
đối với mỗi nei, w trong biểu đồ [e], thực hiện
-
d2:=d + w
-
nếu d2
-
dist [nei]:=d2
-
thêm [d2, nei] vào pq
-
-
-
-
trả về -1
Ví dụ
Hãy cùng chúng tôi xem cách triển khai sau để hiểu rõ hơn -
nhập bộ sưu tập heapqfrom nhập mặc định lớp Giải pháp:def giải (tự, bộ, loại bỏ):N =len (loại bỏ) đồ thị =[[] cho _ trong phạm vi (N + 1)] cho s, e, w trong bộ:graph [s] .append ([e + 1, w]) for i, r in enumerate (Removal):graph [i + 1] .append ([i, r]) pq =[[0, 0]] dist =defaultdict (lambda:float ("inf")) dist [0] =0 while pq:d, e =heapq.heappop (pq) if dist [e] Đầu vào
[[0, 4, 4], [0, 5, 12], [2, 6, 9], [4, 8, 10]], [2, 5, 4, 6, 8] Đầu ra
4