CSES - Shortest Routes II | Tuyến đường ngắn nhất II

Xem PDF

Điểm: 1400 (p) Thời gian: 1.0s Bộ nhớ: 512M Input: bàn phím Output: màn hình

\(n\) thành phố và \(m\) con đường giữa chúng. Nhiệm vụ của bạn là hãy xử lý \(q\) truy vấn mà trong đó bạn phải xác định độ dài của tuyến đường ngắn nhất giữa hai thành phố cho trước.

Input

  • Dòng đầu vào đầu tiên có ba số nguyên \(n\), \(m\)\(q\): số lượng thành phố, con đường và truy vấn.
  • Sau đó, có \(m\) dòng mô tả các con đường. Mỗi dòng có ba số nguyên \(a\), \(b\)\(c\): có một con đường giữa các thành phố \(a\)\(b\) mà độ dài của nó là \(c\). Tất cả con đường đều là con đường hai chiều.
  • Cuối cùng, có \(q\) dòng mô tả các truy vấn. Mỗi dòng có hai số nguyên \(a\)\(b\): xác định độ dài của tuyến đường ngắn nhất giữa các thành phố \(a\)\(b\).

Output

  • In độ dài của tuyến đường ngắn nhất với mỗi truy vấn. Nếu không có tuyến đường nào, in \(-1\) thay vào đó.

Constraints

  • \(1 \le n \le 500\)
  • \(1 \le m \le n^2\)
  • \(1 \le q \le 10^5\)
  • \(1 \le a,b \le n\)
  • \(1 \le c \le 10^9\)

Example

Sample input

4 3 5
1 2 5
1 3 9
2 3 3
1 2
2 1
1 3
1 4
3 2

Sample output

5
5
8
-1
3


Bình luận


  • 0
    rock    7:54 p.m. 24 Tháng 10, 2024

    uses math;
    var a,b,c,q,d,i,n,u,m,v,x:int64;
    s:array[0..501,0..501] of int64;
    vi:array[0..501,0..501] of boolean;
    t1:text;
    begin
    read(m,n,q);
    fillchar(vi,sizeof(vi),false);

    for i:=1 to n do
    begin
    read(u,v,x);
    if vi[u,v] then
    begin
    s[u,v]:=min(s[u,v],x);
    s[v,u]:=s[u,v];
    end
    else
    begin
    s[u,v]:=x;
    s[v,u]:=x;
    end;
    vi[u,v]:=true;
    vi[v,u]:=true;
    end;
    for i:=1 to m do
    for a:=1 to m do
    for b:=1 to m do
    if a=b then
    continue
    else
    if not(vi[a,b]) and (vi[i,a]) and (vi[i,b]) then
    begin
    vi[a,b]:=true;
    s[a,b]:=s[i,a]+s[i,b];
    end
    else
    if (s[a,b]>s[i,a]+s[i,b]) and (vi[i,a]) and (vi[i,b]) then
    s[a,b]:=s[i,a]+s[i,b];

    for i:=1 to q do
    begin
    read(u,v);
    if u=v then
    writeln(0)
    else
    if not(vi[u,v]) then
    writeln(-1)
    else
    writeln(s[u,v]);
    end;

    end.
    (pascal)