trang chủ / bài tập / wrongfloyd

Floyd sai

Đề bài

Mô tả

Valera đang nghiên cứu thuật toán Floyd để tính khoảng cách ngắn nhất giữa mọi cặp đỉnh của một đồ thị vô hướng, liên thông gồm n đỉnh và m cạnh (không có khuyên và không có cạnh bội).

Ngoài ra, Valera đánh dấu đúng k đỉnh a1,a2,,ak. Đoạn mã của Valera như sau:

ans[i][j] // khoang cach ngan nhat giua cap dinh i, j
a[i]      // cac dinh duoc Valera danh dau

for (i = 1; i <= n; i++)
    for (j = 1; j <= n; j++)
        if (i == j) ans[i][j] = 0;
        else        ans[i][j] = INF;   // INF la mot so rat lon

for (i = 1; i <= m; i++) {
    doc mot cap dinh u, v co canh vo huong noi giua chung;
    ans[u][v] = 1;
    ans[v][u] = 1;
}

for (i = 1; i <= k; i++) {
    v = a[i];
    for (j = 1; j <= n; j++)
        for (r = 1; r <= n; r++)
            ans[j][r] = min(ans[j][r], ans[j][v] + ans[v][r]);
}

Điểm khác biệt so với Floyd đúng: vòng lặp cập nhật chỉ chạy qua các đỉnh đã được đánh dấu a1,,ak làm đỉnh trung gian (Floyd đúng phải chạy qua tất cả n đỉnh). Vì thế đoạn mã có thể tính sai.

Cho trước tập đỉnh được đánh dấu, hãy dựng một đồ thị vô hướng liên thông gồm đúng n đỉnh và m cạnh (không khuyên, không cạnh bội) sao cho đoạn mã của Valera tính sai khoảng cách ngắn nhất cho ít nhất một cặp đỉnh (i,j). Nếu không tồn tại đồ thị như vậy, in ra 1.

Dữ liệu vào

  • Dòng đầu chứa ba số nguyên n, m, k.
  • Dòng thứ hai chứa k số nguyên phân biệt a1,a2,,ak là các đỉnh được đánh dấu.

Dữ liệu ra

  • Nếu không tồn tại đồ thị thoả mãn, in ra 1.
  • Ngược lại, in ra m dòng, mỗi dòng gồm hai số nguyên u, v mô tả một cạnh vô hướng của đồ thị. Đồ thị phải liên thông, không có khuyên và không có cạnh bội.

Nếu có nhiều đồ thị thoả mãn, in ra một đồ thị bất kỳ.

Ràng buộc

  • 3n300
  • 2kn
  • n1mn(n1)2
  • 1ain, các ai đôi một phân biệt.

Ví dụ

Input Output Giải thích
3 2 2
1 2
1 3
2 3
Đồ thị có cạnh 1-3 và 2-3. Khoảng cách thật giữa 1 và 2 là 2 (qua đỉnh 3). Nhưng đỉnh 3 không được đánh dấu nên đoạn mã của Valera không cập nhật qua nó, giữ nguyên ans[1][2] = INF, tức là sai.
3 3 2
1 2
-1 Với n=3 chỉ có tối đa 3 cạnh, mà đồ thị bắt buộc phải là đồ thị đầy đủ. Khi đó mọi khoảng cách đều bằng 1 và Valera luôn tính đúng, nên không tồn tại đồ thị thoả mãn.

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.46 awk 1.3.4 gcc 16.1.0 csc 6.12.0.200 g++ 16.1.0 g++-themis 16.1.0 g++17 16.1.0 g++20 16.1.0 g++23 16.1.0 clang++ 22.1.6 dmd 2.112.0 dart 3.12.1 gforth 0.7.3 gfortran 12.2.0 go 1.26.3 groovyc 5.0.6 javac 25.0.3 node 26.2.0 kotlinc 2.3.21 sbcl 2.2.9 lua 5.4.8 nim 2.2.10 fpc 3.2.2 fpc-themis 3.2.2 perl 5.36.0 php 8.5.6 pike 8.0 pypy3 7.3.23 python3 3.14.5 racket 8.7 ruby 4.0.5 rustc 1.96.0 csc 5.3.0 ctoj-scratch 0.0.1 sed 4.9 tclsh 8.6 bun 1.3.14 deno 2.8.1 v 0.5.1 zig 0.16.0