输出格式:
输出文件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 54
解题思路:
用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.