1. 程式人生 > >洛谷_P1119_災後重建

洛谷_P1119_災後重建

完成 tro 否則 family var 輸出 for begin int

題目大意:

地震後,有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.

洛谷_P1119_災後重建