洛谷_P1119_灾后重建

题目大意:

地震后,有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.
posted @ 2018-08-18 19:57  猪都哭了  阅读(97)  评论(0编辑  收藏  举报