trang chủ / đề bài / dhbb23_rescue

Cứu hộ

Đề bài

Mô tả

Vũ trụ Z có n hành tinh, các hành tinh được đánh số từ 1 đến n. Một hệ thống gồm m đường dịch chuyển, đường dịch chuyển thứ k (1≤k≤m) sẽ giúp di chuyển từ hành tinh ik đến hành tinh jk (chỉ theo một chiều) và mất chi phí là e(ik,jk). Một vụ nổ trong vũ trụ đã làm ảnh hưởng lớn đến tất cả các hành tinh, trừ hành tinh số 1. Hành tinh số 1 lên kế hoạch cứu hộ cho n−1 hành tinh còn lại.

Các nhà khoa học ở hành tinh số 1 đã tìm ra cách di chuyển giúp đội cứu hộ có thể di chuyển đến một hành tinh khác với chi phí nhỏ hơn. Cụ thể, với số nguyên không âm a mà các nhà khoa học thiết đặt, giả sử đội cứu hộ lần lượt di chuyển qua dãy gồm p hành tinh 1=x1,x2,…,xp. Như vậy, đội cứu hộ sẽ phải sử dụng p−1 đường dịch chuyển, gọi s1 là tổng chi phí của p−1 đường dịch chuyển, gọi r1 là tổng chi phí của a đường dịch chuyển có chi phí lớn nhất trong p−1 đường dịch chuyển (nếu a>p−1 thì tính tổng chi phí của p−1 đường dịch chuyển), khi đó đội cứu hộ sẽ mất chi phí là s1−r1.

Về phía các hành tinh, các nhà khoa học cũng đã tính toán ra số nguyên không âm b dựa trên mức độ ảnh hưởng của vụ nổ để xác định được chi phí di chuyển của cư dân. Cụ thể, nếu cư dân hành tinh i phải di chuyển qua dãy gồm q hành tinh i=y1,y2,…,yq, gọi s2 là tổng chi phí của q−1 đường dịch chuyển, gọi r2 là tổng chi phí của b đường dịch chuyển có chi phí nhỏ nhất trong q−1 đường dịch chuyển (nếu b>q−1 thì tính tổng chi phí của q−1 đường dịch chuyển), khi đó cư dân sẽ mất chi phí là s2+r2.

Trong các dãy hành tinh trên, mỗi bước đi từ xt đến xt+1 (hoặc từ yt đến yt+1) phải theo một đường dịch chuyển từ xt đến xt+1; một hành tinh hay một đường dịch chuyển có thể được đi qua nhiều lần, khi đó chi phí của đường dịch chuyển được tính mỗi lần sử dụng. Dãy có thể chỉ gồm một hành tinh (p=1 hoặc q=1, không di chuyển), khi đó chi phí bằng 0.

Chi phí để đội cứu hộ gặp được cư dân hành tinh i là tổng chi phí di chuyển của đội cứu hộ cộng với tổng chi phí của cư dân hành tinh i di chuyển để họ gặp được nhau (tại cùng một hành tinh).

Yêu cầu: Với mỗi hành tinh i (2≤i≤n), hãy tính chi phí nhỏ nhất để đội cứu hộ xuất phát từ hành tinh 1 có thể gặp cư dân hành tinh i.

Dữ liệu vào

  • Dòng đầu chứa bốn số nguyên n,m,a,b;
  • Dòng thứ k (1≤k≤m) trong m dòng tiếp theo chứa ba số nguyên dương ik,jk,e(ik,jk), trong đó 1≤ik≠jk≤n và e(ik,jk)≤109. Dữ liệu đảm bảo từ hành tinh i không có quá một đường dịch chuyển tới j và không tới chính nó.

Dữ liệu ra

In ra một dòng gồm n−1 số, số thứ i là chi phí nhỏ nhất để đội cứu hộ có thể gặp cư dân hành tinh i+1, nếu đội cứu hộ không thể gặp được cư dân thì đưa ra số −1 tương ứng.

Ràng buộc

  • 2≤n≤105; 1≤m≤105;
  • 0≤a,b≤3;
  • 1≤ik≠jk≤n; 1≤e(ik,jk)≤109.

Subtasks

  • Subtask 1 (25% số điểm): n≤100; m≤1000; a=b=0;
  • Subtask 2 (25% số điểm): n≤100; m≤1000; a=b=1;
  • Subtask 3 (25% số điểm): n≤105; m≤105; a=b=0;
  • Subtask 4 (25% số điểm): n≤105; m≤105; 0≤a,b≤3.

Ví dụ

Input Output Giải thích
4 4 1 1
1 2 1
2 3 2
3 4 3
4 2 1
0 1 2 Các đường dịch chuyển: 1→2 (chi phí 1), 2→3 (2), 3→4 (3), 4→2 (1). Hành tinh 2: đội cứu hộ đi 1→2, s1−r1=1−1=0. Hành tinh 3: đội cứu hộ đi 1→2→3, chi phí 3−2=1. Hành tinh 4: đội cứu hộ đến hành tinh 2 với chi phí 0, cư dân đi 4→2 với chi phí 1+1=2, tổng 2.
3 3 0 1
2 1 10
2 3 1
3 2 1
13 12 Đội cứu hộ không đi được đâu nên phải gặp cư dân ở hành tinh 1. Cư dân hành tinh 2 đi thẳng 2→1 mất 10+10=20, nhưng đi 2→3→2→1 (đi qua hành tinh 2 hai lần) mất s2+r2=12+1=13. Cư dân hành tinh 3 đi 3→2→1 mất 11+1=12.
3 3 1 3
1 2 6
2 3 5
3 2 2
0 4 Hành tinh 2: đội cứu hộ đi 1→2, chi phí 0. Hành tinh 3: gặp tại hành tinh 3 tốn 11−6=5; tốt hơn là gặp tại hành tinh 2: đội cứu hộ tốn 0, cư dân đi 3→2 chỉ dùng 1<b đường dịch chuyển nên r2=s2, chi phí 2+2=4.

Bình luận

Không có bình luận tại thời điểm này.

gnatmake 12.2.0 a68g 3.1.2 nasm 2.16.1 as_x64 2.47 awk 1.3.4 gcc 16.2.0 dotnet 10.0.402 g++ 16.2.0 g++-themis 16.2.0 g++17 16.2.0 g++20 16.2.0 g++23 16.2.0 clang++ 22.1.8 dmd 2.113.0 dart 3.13.6 gforth 0.7.3 gfortran 15.3.0 go 1.27.3 groovyc 5.1.3 javac 26.0.2.1 node 26.12.1 julia 1.13.2 kotlinc 2.4.21 lean 4.35.0 sbcl 2.2.9 lua 5.5.1 nim 2.2.12 fpc 3.2.2 fpc-themis 3.2.2 perl 5.42.3 php 8.5.12 pike 8.0 swipl 9.0.4 pypy3 7.3.23 python3 3.15.1 racket 8.7 ruby 4.0.8 rustc 1.99.1 csc 5.3.0 ctoj-scratch 0.0.1 sed 4.9 swiftc 6.4.1 tclsh 8.6 bun 1.4.4 deno 2.9.8 v 0.5.2 zig 0.17.0