災後重建(洛谷P1119)

2021-10-06 06:06:47 字數 2505 閱讀 5829

問題描述

b 地區在**過後,所有村莊都造成了一定的損毀,而這場**卻沒對公路造成什麼影響。但是在村莊重建好之前,所有與未重建完成的村莊的公路均無法通車。換句話說,只有連線著兩個重建完成的村莊的公路才能通車,只能到達重建完成的村莊。

給出 b 地區的村莊數 n,村莊編號從 0 到 n - 1,和所有 m 條公路的長度,公路是雙向的。並給出第 i 個村莊重建完成的時間 ti ,你可以認為是同時開始重建並在第 ti 天重建完成,且在當天即可通車。若 ti 為 0 則說明**未對此地區造成損壞,一開始就可以通車。之後有 q 個詢問 ( x , y , t ) ,對於每個詢問你要回答在第 t 天,從村莊 x 到村莊 y 的最短路徑長度為多少。如果無法找到從 x 村莊到 y 村莊的路徑,經過若干個已重建完成的村莊,或者村莊 x 或村莊 y 在第 t 天仍未重建完成,則需要返回 -1 。

輸入格式

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

第二行包含 n 個非負整數 t0,t1,… ,t(n-1),表示了每個村莊重建完成的時間,資料保證了 t0 ≤ t1 ≤ … ≤ 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 是不下降的。

輸出格式

共 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 ≤ 50 ;

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

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

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

演算法思路

題目本質上就是求多源點最短路問題,由於資料較小,所以可以用floyd演算法。

每輸入一次詢問,就將重建時間小於 t 的村莊加入到規劃中,更新dist矩陣。儲存此次詢問的答案。

最後將每次詢問儲存的答案ans陣列輸出。

實現**c++

// 此檔案包含 "main" 函式。程式執行將在此處開始並結束。

// 洛谷p1119 - 災後重建

#include using namespace std;

const int max_n = 200;

const int max_m = max_n * (max_n - 1) / 2;

const int max_dist = 100001;

const int max_q = 50000;

void buildmindist(int dist[max_n][max_n], int n, int k)

} }}int getans(int dist[max_n][max_n], int rebuilddates, int x, int y, int t)

else

return ans;

}// 輸出dist矩陣,除錯使用。

void printdist(int dist[max_n],int n)

cout << endl;

} cout << "---end-------------" << endl;

}int main()

else

}} // 輸入每個村莊的重建時間

for (int a = 0; a < n; a++)

// 輸入每條公路的長度

for (int a = 0; a < m; a++)

// 輸入詢問數

cin >> q;

// 輸入q組詢問並儲存每組詢問的答案。k代表待重建的村莊編號。

int k = 0;

for (int a = 0; a < q; a++)

ans[a] = getans(dist, rebuilddates, x, y, t);

} // 輸出答案

for (int a = 0; a < q; a++)

return 0;

}

洛谷 P1119 災後重建

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

洛谷 P1119 災後重建

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

洛谷 P1119 災後重建

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