Không hỗ trợ Mobile

Chế độ luyện tập yêu cầu môi trường màn hình lớn để làm bài và chống gian lận hiệu quả. Vui lòng truy cập bằng máy tính (Desktop/Laptop) để tiếp tục thao tác.

Quay lại trang chủ

#1513 · Chú cá sấu thích tắm

Spampy là một chú cá sấu tò mò, thân thiện thích tắm sau một ngày làm việc vất vả. Spampy có n điểm và m ống nước (ống nước không có máy bơm nên chỉ có thể đi theo 1 hướng). Với s là nguồn nước và t bồn tắm của Spampy.

Ống nước đã bị hao mòn qua thời gian sử dụng nên lượng nước Spampy nhận được sẽ bị thất thoát khi đi qua các ống nước này. May mắn thay, Spampy đã tìm được 1 ống nước có máy bơm để nước có thể đi qua từ cả 2 hướng. Bạn gái của Spampy – Allie đã giúp cậu đánh dấu k nơi mà ống nước có thể lấp đặt và tính toán lượng nước sẽ bị mất nếu ống nước được lắp đặt ở đó.

Nhưng vì có quá nhiều nơi, Spampy không biết đâu là nơi thích hợp để lắp ống nước sao cho số lượng nước bị mất đi là ít nhất. Bạn hãy giúp chú cá sấu Spampy này nhé!

17039907141590.jpg

Dữ liệu vào

  • Dòng đầu tiên chứa 5 số nguyên dương n (n ≤ 10000), m (m ≤ 100000), k $(k < 300)$, $s$ $(1 ≤ s ≤ n)$, $t$ $(1 ≤ t ≤ n)$ cách nhau bởi dấu cách.
  • m dòng tiếp theo, mỗi dòng chứa 3 số nguyên u, v, c $(0 < c ≤ 1000)$ cách nhau bởi dấu cách, trong đó $c$ là lượng nước mất đi của ống nước của Spampy từ $u$ đến $v$.
  • k dòng tiếp theo, mỗi dòng chứa 3 số nguyên x, y, q $(0 < q ≤ 1000)$ cách nhau bởi dấu cách, trong đó $q$ là lượng nước mất đi nếu lấp ống nước có máy bơm nối $2$ điểm $x$ và $y$.

Dữ liệu ra

Một dòng duy nhất, ghi ra lượng nước mất đi ít nhất sau khi lấp ống nước có máy bơm.

Lưu ý: Trường hợp không có đường nước từ s đến t, in kết quả ra -1.

BẢNG TỔNG QUAN KẾT QUẢ

# Tài khoản Kết suất Lúc nộp
1
53 ms 3904 KB
2838 Bytes
02/01/2024
09:33
2
55 ms 3892 KB
2838 Bytes
31/12/2023
22:28
3
63 ms 2900 KB
2595 Bytes
27/05/2026
08:20
4
64 ms 3888 KB
2838 Bytes
23/12/2025
15:38
5
82 ms 16400 KB
1269 Bytes
10/07/2024
18:05
6
84 ms 16408 KB
1269 Bytes
10/07/2024
18:05
7
85 ms 16404 KB
1269 Bytes
10/07/2024
18:07
8
85 ms 16408 KB
1269 Bytes
10/07/2024
18:05
9
86 ms 16412 KB
1269 Bytes
10/07/2024
18:04
10
92 ms 4532 KB
2121 Bytes
01/09/2025
22:15
11
97 ms 5336 KB
2488 Bytes
20/05/2026
23:04
12
153 ms 6860 KB
2601 Bytes
26/05/2026
19:30
13
158 ms 8632 KB
1934 Bytes
31/12/2023
21:06
14
709 ms 28508 KB
1306 Bytes
01/01/2024
21:41
15
709 ms 28520 KB
1309 Bytes
01/01/2024
21:52
16
715 ms 28500 KB
1306 Bytes
01/01/2024
21:41
17
716 ms 28504 KB
1311 Bytes
01/01/2024
21:45
18
719 ms 28504 KB
1306 Bytes
01/01/2024
21:42
19
721 ms 28500 KB
1306 Bytes
01/01/2024
21:41
20
721 ms 28500 KB
1306 Bytes
01/01/2024
21:42

LỊCH SỬ CÁ NHÂN

Vui lòng đăng nhập để xem lịch sử làm bài của bạn.

THẢO LUẬN BÀI TOÁN

6 ngày trước

Hello vẫn là tui ở đây để giúp bạn giải bài toán trên. Dài quá thì vô acc tui vào link drive lấy code mà tui đã giải để tham khảo ^^

include <stdio.h>

include <stdlib.h>

define VC 1000000000

int d_t[10005], dc_t[100005], ts_t[100005], kt_t[100005], sm_t = 0; int d_n[10005], dc_n[100005], ts_n[100005], kt_n[100005], sm_n = 0;

void t_ct(int d1, int d2, int ts) {

sm_t++; dc_t[sm_t] = d2; ts_t[sm_t] = ts; kt_t[sm_t] = d_t[d1]; d_t[d1] = sm_t;

}

void t_cn(int d1, int d2, int ts) {

sm_n++; dc_n[sm_n] = d2; ts_n[sm_n] = ts; kt_n[sm_n] = d_n[d1]; d_n[d1] = sm_n;

}

typedef struct { int kc, d; } Pt; Pt hd[1000005]; int s_hd = 0;

void hd_t(int kc, int d) {

hd[++s_hd] = (Pt){kc, d};
int i = s_hd;
while (i > 1 && hd[i].kc < hd[i / 2].kc) {
    Pt x = hd[i]; hd[i] = hd[i / 2]; hd[i / 2] = x;
    i /= 2;
}

}

Pt hd_l() {

Pt r = hd[1];
hd[1] = hd[s_hd--];
int i = 1;
while (i * 2 <= s_hd) {
    int j = i * 2;
    if (j < s_hd && hd[j + 1].kc < hd[j].kc) j++;
    if (hd[i].kc <= hd[j].kc) break;
    Pt x = hd[i]; hd[i] = hd[j]; hd[j] = x;
    i = j;
}
return r;

}

int kcd[10005], kcc[10005];

void t_dd(int xp, int* kc, int d_d[], int dc_d[], int ts_d[], int kt_d[], int sd) {

for (int i = 1; i <= sd; i++) kc[i] = VC;
kc[xp] = 0;
s_hd = 0;
hd_t(0, xp);
while (s_hd > 0) {
    Pt x = hd_l();
    if (x.kc > kc[x.d]) continue;
    for (int i = d_d[x.d]; i; i = kt_d[i]) {
        int d2 = dc_d[i];
        int ts = ts_d[i];
        if (kc[d2] > kc[x.d] + ts) {
            kc[d2] = kc[x.d] + ts;
            hd_t(kc[d2], d2);
        }
    }
}

}

int main() {

int sd, sc, sk, s_s, s_t;
if (scanf("%d %d %d %d %d", &sd, &sc, &sk, &s_s, &s_t) != 5) return 0;

for (int i = 0; i < sc; i++) {
    int d1, d2, ts;
    scanf("%d %d %d", &d1, &d2, &ts);
    t_ct(d1, d2, ts);
    t_cn(d2, d1, ts);
}

t_dd(s_s, kcd, d_t, dc_t, ts_t, kt_t, sd);
t_dd(s_t, kcc, d_n, dc_n, ts_n, kt_n, sd);

int kqn = kcd[s_t];
for (int i = 0; i < sk; i++) {
    int d1, d2, ts;
    scanf("%d %d %d", &d1, &d2, &ts);
    if (kcd[d1] != VC && kcc[d2] != VC) {
        if (kqn > kcd[d1] + ts + kcc[d2]) kqn = kcd[d1] + ts + kcc[d2];
    }
    if (kcd[d2] != VC && kcc[d1] != VC) {
        if (kqn > kcd[d2] + ts + kcc[d1]) kqn = kcd[d2] + ts + kcc[d1];
    }
}

if (kqn == VC) printf("-1\n");
else printf("%d\n", kqn);

return 0;

}

Vào thảo luận 0 Phản hồi
Viết code