题目大意:
地震后,有N个受损的村庄,在任一一个村庄重建完成之前,其他村庄都不能到达这个村庄。
给出N个村庄重建完成的时间和连通的情况。
有Q个询问,问在时间T,A和B这两个村庄是否连通。
若连通,则输出A和B的最短路径,否则输出-1。
题解:
因为保证询问的时间T是不递减,只需判断中转站k是否连通即可。
代码:
1 var
2 n,m,Q:longint;
3 t:array [0..2001] of longint;
4 a:array [0..201,0..201] of longint;
5 procedure init;
6 var
7 i,x,y,z:longint;
8 begin
9 fillchar(a,sizeof(a),63);
10 fillchar(t,sizeof(t),63);
11 readln(n,m);
12 for i:=1 to n do
13 begin
14 read(t[i]);
15 a[i,i]:=0;
16 end;
17 for i:=1 to m do
18 begin
19 readln(x,y,z);
20 x:=x+1; y:=y+1;
21 a[x,y]:=z; a[y,x]:=z;
22 end;
23 end;
24
25 function min(o,p:longint):longint;
26 begin
27 if o<p then exit(o);
28 exit(p);
29 end;
30
31 procedure main;
32 var
33 k,i,j,ii,x,y,tt:longint;
34 begin
35 readln(Q);
36 k:=1;
37 for ii:=1 to Q do
38 begin
39 readln(x,y,tt);
40 x:=x+1; y:=y+1;
41 while t[k]<=tt do
42 begin
43 for i:=1 to n do
44 for j:=1 to n do
45 a[i,j]:=min(a[i,j],a[i,k]+a[k,j]);
46 inc(k);
47 end;
48 if (t[x]<=tt) and (t[y]<=tt) and (a[x,y]<>a[0,0]) then
49 writeln(a[x,y]) else
50 writeln('-1');
51 end;
52 end;
53
54 begin
55 init;
56 main;
57 end.