给出B地区的村庄数N,村庄编号从0到N-1,和所有M条公路的长度,公路是双向的。并给出第i个村庄重建完成的时间t[i],你可以认为是同时开始重建并在第t[i]天重建完成,并且在当天即可通车。若t[i]为0则说明地震未对此地区造成损坏,一开始就可以通车。之后有Q个询问(x, y, t),对于每个询问你要回答在第t天,从村庄x到村庄y的最短路径长度为多少。如果无法找到从x村庄到y村庄的路径,经过若干个已重建完成的村庄,或者村庄x或村庄y在第t天仍未重建完成 ,则需要返回-1。
输入格式:
第一行包含两个正整数N,M,表示了村庄的数目与公路的数量。
第二行包含N个非负整数t[0], t[1], …, t[N – 1],表示了每个村庄重建完成的时间,数据保证了t[0] ≤ t[1] ≤ … ≤ t[N – 1]。
接下来M行,每行3个非负整数i, j, w,w为不超过10000的正整数,表示了有一条连接村庄i与村庄j的道路,长度为w,保证i≠j,且对于任意一对村庄只会存在一条道路。
接下来一行也就是M+3行包含一个正整数Q,表示Q个询问。
接下来Q行,每行3个非负整数x, y, t,询问在第t天,从村庄x到村庄y的最短路径长度为多少,数据保证了t是不下降的。
输出格式:
输出文件rebuild.out包含Q行,对每一个询问(x, y, t)输出对应的答案,即在第t天,从村庄x到村庄y的最短路径长度为多少。如果在第t天无法找到从x村庄到y村庄的路径,经过若干个已重建完成的村庄,或者村庄x或村庄y在第t天仍未修复完成,则输出-1。输入样例#1:
4 5
1 2 3 4
0 2 1
2 3 1
3 1 2
2 1 4
0 3 5
4
2 0 2
0 1 2
0 1 3
0 1 4
输出样例#1:
-1
-1
5
4
解题思路:
用flody 具体的方法就是:排序后最外重k的循环表示到前k个人为止,所算出的最短路(当然如果询问的点本身大于k就要输出-1)
代码:
var
n,m,i,j,g,x,y,z,k,h:longint;
t:array[0..200000]of longint;
f,a:array[0..500,0..500]of longint;
begin
readln(n,m);
for i:=1 to n do
read(t[i]);
readln;
t[n+1]:=maxlongint;
fillchar(f,sizeof(f),$1);
for i:=1 to m do
begin
readln(x,y,z);
inc(x);inc(y);
f[x,y]:=z;
f[y,x]:=z;
end;
readln(g);
k:=1;
for h:=1 to g do
begin
readln(x,y,z);
inc(x);inc(y);
while (t[k]<=z) do
begin
for i:=1 to n do
for j:=1 to n do
if i<>j then
if f[i,j]>f[i,k]+f[k,j] then f[i,j]:=f[i,k]+f[k,j];
inc(k);
end;
if (f[x,y]<>16843009)and(t[x]<=z)and(t[y]<=z)
then writeln(f[x,y])
else writeln('-1');
end;
end.