2016東莞市特長生考試 村莊重建

2021-07-30 09:55:31 字數 2609 閱讀 2885

2016東莞市特長生考試 村莊重建

time limit:10000ms memory limit:256000k

total submit:3 accepted:1

case time limit:1000ms

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。

sample input

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

sample output

-1 -1 5 4

hint

【資料說明】

對於 30%的資料,有 n≤50;

對於 30%的資料,有 t[i] = 0,其中有 20%的資料有 t[i] = 0 且 n>50;

對於 50%的資料,有 q≤100;

對於 100%的資料,有 n≤200,m≤n*(n-1)/2,q≤50000,所有輸入資料涉及整數均不超過 100000

ps:那個樣例輸入有點問題,根據題意自己看著換行

做法:用floyd更新,當前詢問到哪天(因為最後的詢問第幾天是保證不下降的),就用這天之前(包括這天)的解封的點更新最短路,最後如果詢問的座標有哪個點無法達到就輸出-1

**如下:

const

maxn=200;

var ti:array[0..maxn] of longint;

f:array[0..maxn,0..maxn] of longint;

i,j,n,m,x,y,q,l,t,d,k:longint;

begin

read(n,m);

for i:=0

to n-1

dofor j:=0

to n-1

doif (i<>j) then f[i,j]:=maxlongint div

3; for i:=0

to n-1

doread(ti[i]);

for i:=0

to m-1

dobegin

read(x,y,d);

f[x,y]:=d;

f[y,x]:=d;

end;

read(q);

k:=0;

t:=0;

for l:=0

to q-1

dobegin

read(x,y,d);

while (kand(ti[k]<=d) do inc(k);

while tdo

begin

for i:=0

to n-1

dofor j:=0

to n-1

doif f[i,t]+f[t,j]then f[i,j]:=f[i,t]+f[t,j];

inc(t);

end;

if (x>=k)or(y>=k)or(f[x,y]=maxlongint div

3) then writeln(-1)

else writeln(f[x,y]);

end;

end.

2016東莞市特長生考試 遊戲問題

2016東莞市特長生考試 遊戲問題 description 五四 青年節到了,某學校要舉行乙個遊園活動,其中有乙個這樣的遊戲 n 個同學 編號從 0 到 n 1 圍坐一圈,按照順時針方向給 n 個位置編號,從0 到 n 1。最初,第 0 號同學在第 0 號位置,第 1 號同學在第 1 號位置,依此類...

2016東莞市特長生考試 子數整數

對於乙個五位數,可將其拆分為三個數字 sub1 a1a2a3,sub2 a2a3a4,sub3 a3a4a5 現在給定乙個正整數 k,要求你程式設計求出 10000 包括 10000 到 30000 包括 30000 之間所有滿足下述條件的五位數,條件是這些五位數的三個子數 sub1,sub2,su...

2016東莞市特長生考試 字串距離 dp

2016東莞市特長生考試 字串距離 description 設有字串 x,我們稱在 x 的頭尾及中間插入任意多個空格後構成的新字元 串為 x 的擴充套件串,如字串 x 為 abcbcd 則字串 abcb cd a bcbcd 和 abcb cd 都是 x 的擴充套件串,這裡 代表空格字元。如果 a1...