洛谷 P1119 災後重建 最短路 Floyd演算法

2022-07-16 22:15:21 字數 2307 閱讀 4589

目錄輸入輸出樣例

說明思路

ac**

總結p1119 災後重建

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 $ 。

第一行包含兩個正整數 $ n,m $ ,表示了村莊的數目與公路的數量。

第二行包含 n 個非負整數 $ t_0, t_1,…, t_ $ ,表示了每個村莊重建完成的時間,資料保證了 $ t_0 \leq t_1 \leq ... \leq t_ $

接下來 $ 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 $ 是不下降的。

共 $ q $ 行,對每乙個詢問 $ (x,y,t) $ 輸出對應的答案,即在第 $ t $ 天,從村莊 $ x $ 到村莊 $ y $ 的最短路徑長度為多少。如果在第 $ t $ 天無法找到從 $ x $ 村莊到 $ y $ 村莊的路徑,經過若干個已重建完成的村莊,或者村莊 $ x $ 或村莊 $ y $ 在第 $ t $ 天仍未修復完成,則輸出 $ -1 $ 。

4 5

1 2 3 4

0 2 1

2 3 1

3 1 2

2 1 4

0 3 5

42 0 2

0 1 2

0 1 3

0 1 4

-1-15

4

【資料範圍】

對於30%的資料,有 $ n \leq 50 $;

對於30%的資料,有 $ t_i=0 $ ,其中有 20% 的資料有 $ t_i=0 $ 且 $ n>50 $ ;

對於50%的資料,有 $ q \leq 100 $ ;

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

【時空限制】

1000ms,128m

首先看到要多次詢問兩點間的最短路,可以考慮用floyd演算法。可是兩點間的距離是隨著時間而變化的,怎麼辦呢?

顯然我們可以這樣做:當每次詢問時,我們將此時已經修建好的村莊之間跑一遍floyd,其他村莊不管。但是這樣做肯定會tle。

想想怎麼優化。注意到詢問時 $ t_i $ 是遞增的,村莊修建好的順序也是遞增的,那麼我們可以記錄乙個當前修建好的村莊的最大編號。每次詢問時,看是否有新的村莊修好了,如果有,那麼把他加進來作為中轉點跑一次最短路

#includeconst int maxn=210;

using namespace std;

int n,m,t[maxn];

int q,np;

int dis[maxn][maxn];

int main()

scanf("%d",&q);

np=1;

for(int i=1;i<=q;i++)

if(t[u]<=t && t[v]<=t && dis[u][v]!=int_max/2) printf("%d\n",dis[u][v]);

else printf("-1\n");

}return 0;

}

優化的這一步可以說題目也提示了很多。如果題中沒有給遞增條件,也許我就不會做了。

洛谷P1119 災後重建(最短路)

b地區在 過後,所有村莊都造成了一定的損毀,而這場 卻沒對公路造成什麼影響。但是在村莊重建好之前,所有與未重建完成的村莊的公路均無法通車。換句話說,只有連線著兩個重建完成的村莊的公路才能通車,只能到達重建完成的村莊。給出b地區的村莊數n,村莊編號從0到n 1,和所有m條公路的長度,公路是雙向的。並給...

洛谷P1119 災後重建(最短路)

b地區在 過後,所有村莊都造成了一定的損毀,而這場 卻沒對公路造成什麼影響。但是在村莊重建好之前,所有與未重建完成的村莊的公路均無法通車。換句話說,只有連線著兩個重建完成的村莊的公路才能通車,只能到達重建完成的村莊。給出b地區的村莊數n,村莊編號從0到n 1,和所有m條公路的長度,公路是雙向的。並給...

洛谷P1119 災後重建 最短路

bb 地區在 過後,所有村莊都造成了一定的損毀,而這場 卻沒對公路造成什麼影響。但是在村莊重建好之前,所有與未重建完成的村莊的公路均無法通車。換句話說,只有連線著兩個重建完成的村莊的公路才能通車,只能到達重建完成的村莊。給出b地區的村莊數n,村莊編號從00到n 1n 1,和所有m m條公路的長度,公...