洛谷 1119 灾后重建

    xiaoxiao2021-03-25  197

    题目描述     给出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.

    转载请注明原文地址: https://ju.6miu.com/read-6405.html

    最新回复(0)