2016东莞市特长生考试 村庄重建

来源:互联网 发布:降龙九九软件安装 编辑:程序博客网 时间:2024/04/28 16:25

2016东莞市特长生考试 村庄重建

Description

B 地区在地震过后,所有村庄都造成了一定的损毁,而这场地震却没对公路造成什么影响。但是在村庄重建好之前,所有与未重建完成的村庄的公路均无法通车。换句话说,只有连接着两个重建完成的村庄的公路才能通车,只能到达重建完成的村庄。 

给出 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。

Input

输入文件 rebuild.in 的第一行包含两个正整数 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 是不下降的。

Output

输出文件 rebuild.out 包含 Q 行,对每一个询问(x, y, t)输出对应的答案,即在第 t 天,从村庄 x 到村庄 y 的最短路径长度为多少。如果在第 t 天无法找到从 x 村庄到 y 村庄的路径,经过若干个已重建完成的村庄,或者村庄 x 或村庄 y 
在第 t 天仍未修复完成,则输出-1。


分析:对于每一次询问t,我们把t之前重建好的村庄做一次最短路即可。


代码

const
  maxn=200;
var
  a:array[0..maxn,0..maxn] of longint;
  t:array[0..maxn] of longint;
  i,j,k,n,m,x,y,z,p,q,o,v:longint;


begin
  readln(n,m);
  for i:=0 to n do
    for j:=0 to n do
      a[i,j]:=maxlongint div 2;
  for i:=0 to n-1 do
    read(t[i]);
  for i:=1 to m do
    begin
      read(j,k,p);
      a[j,k]:=p;
      a[k,j]:=p;
    end;
  readln(q);
  for k:=1 to q do
    begin
      readln(x,y,z);
      while (o<n) and (t[o]<=z) do inc(o);
      while v<o do
        begin
          for i:=0 to n-1 do
            for j:=0 to n-1 do
              if a[i,v]+a[v,j]<a[i,j]
                then a[i,j]:=a[i,v]+a[v,j];
          inc(v);
        end;
      if (x>=o) or (y>=o) or (a[x,y]=maxlongint div 2)
        then writeln(-1) else writeln(a[x,y]);
    end;
end.

0 0
原创粉丝点击