Vé xe miễn phí

Xem dạng PDF

Gửi bài giải


Điểm: 0,58 (OI)
Giới hạn thời gian: 1.0s
Giới hạn bộ nhớ: 512M
Input: stdin
Output: stdout

Dạng bài
Ngôn ngữ cho phép
C, C++, Go, Java, Kotlin, Pascal, PyPy, Python, Rust, Scratch

Tham gia trò chơi nhảy lò cò, thật may mắn, Khuê đã giành giải nhất của cuộc thi. Phần thưởng mà Khuê nhận được là ~k~ vé xe buýt miễn phí để đi thăm quan thành phố Hạ Long. Mỗi vé xe chỉ được sử dụng một lần và có thể sử dụng cho bất kỳ tuyến xe buýt nào trong thành phố. Thành phố có ~n~ nút giao thông được đánh số từ ~1~ đến ~n~ và ~m~ tuyến xe buýt hai chiều. Mỗi cặp nút giao thông ~i, j~ có không quá một tuyến xe buýt hai chiều, nếu có thì để đi từ nút ~i~ đến nút ~j~ (hoặc từ nút ~j~ đến nút ~i)~ với giá vé là ~c_{ij} = c_{ji}~ đồng. Xuất phát từ nút giao thông ~s~, Khuê muốn di chuyển đến nút giao thông ~t~ và anh luôn lựa chọn đường đi với chi phí ít nhất.

Ví dụ: thành phố có ~5~ nút giao thông và ~6~ tuyến xe buýt:

Tuyến ~1~: ~1~ -- ~2~ giá vé ~10~ đồng; Tuyến ~2~: ~2~ -- ~5~ giá vé ~10~ đồng;

Tuyến ~3~: ~1~ -- ~4~ giá vé ~3~ đồng; Tuyến ~4~: ~3~ -- ~4~ giá vé ~5~ đồng;

Tuyến ~5~: ~3~ -- ~5~ giá vé ~3~ đồng; Tuyến ~6~: ~1~ -- ~3~ giá vé ~20~ đồng.

image

Xuất phát từ nút ~1~ đến nút ~5~, đi theo hành trình ~1~ -- ~4~ -- ~3~ -- ~5~ hết ~11~ đồng là đường đi với chi phí ít nhất. Tuy nhiên, nếu Khuê sử dụng ~1~ vé xe miễn phí thì đường đi ~1~ -- ~3~ -- ~5~ hết ~3~ đồng là ít nhất (vé xe miễn phí được sử dụng tại tuyến ~1~ -- ~3)~.

Yêu cầu: Cho biết các tuyến xe buýt với giá vé tương ứng và các giá trị ~s~, ~t~, ~k~. Hãy tính chi phí ít nhất để đi từ nút giao thông ~s~ đến nút giao thông ~t~ mà không sử dụng quá ~k~ vé xe miễn phí.

Input

  • Dòng đầu tiên ghi năm số nguyên dương ~n~, ~m~, ~k~, ~s~, ~t~;
  • m dòng sau, mỗi dòng ~3~ số nguyên ~i~, ~j~, ~c_{ij}~ mô tả có tuyến xe buýt ~i~ -- ~j~ hết ~c_{ij}~ đồng.

Output

Một số duy nhất là chi phí ít nhất để đi từ nút giao thông ~s~ đến nút giao thông ~t~ mà không sử dụng quá ~k~ vé xe miễn phí.

Giới hạn

Trong tất cả các test, ~c_{i, j}~ là số nguyên không âm, có giá trị không quá ~10^6~.

  • Có ~40\%~ số test ứng với ~40\%~ số điểm có ~n \leq 100~, ~m \leq 1000~ và ~k = 1~;
  • Có ~20\%~ số test ứng với ~20\%~ số điểm có ~n \leq 10^{5}~, ~m \leq 10^{5}~ và ~k = 1~;
  • Có ~40\%~ số test còn lại ứng với ~40\%~ số điểm có ~n \leq 10^{5}~, ~m \leq 10^{5}~ và ~k \leq 5~.

Sample Input

5 6 1 1 5
1 2 10
2 5 10
1 4 3
3 4 5
3 5 3
1 3 20

Sample Output

3

Bình luận

Hãy đọc nội quy trước khi bình luận.



  • 11
    PPAP_1264589  đã bình luận lúc 8, Tháng 8, 2022, 11:45

    SPOILER ALERT !!

    Thử tạo một đồ thị gồm ~k~ tầng

    Với mỗi cặp (đỉnh, tầng), có hai trường hợp xảy ra khi đi theo cạnh ~(u, v, w)~

    1. Dùng vé: giữ nguyên tầng ~i~ ~(u, i) -> (v, i)~, trọng số ~w~
    2. Không dùng vé: lên tầng ~i~ ~(u, i) -> (v, i+1)~, trọng số ~0~

    Tạo một mảng ~dp[u][skiped]~: Đi đến đỉnh ~u~, đã bỏ qua ~skiped~ cạnh

    Dijkstra: khi đi theo cạnh ~(u, v, w)~

    ~dp[v][skiped] > dp[u][skiped] + w~ : Dùng vé

    ~dp[v][skiped+1] > dp[u][skiped] + 0~: Không dùng vé