P1119 災後重建

2022-09-19 17:54:13 字數 1320 閱讀 3386

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

學習瀕死的spfa與堆優的dijkstra之後floyd就被我們無情地忘記了。

floyd演算法又稱為插點法,是一種利用動態規劃的思想尋找給定的加權圖中多源點之間最短路徑的演算法,與dijkstra演算法類似。該演算法名稱以創始人之一、2023年圖靈獎獲得者、史丹福大學電腦科學系教授羅伯特·弗洛伊德命名。

雖然複雜度很高(時間複雜度 \(o(n^3)\),空間複雜度 \(o(n^2)\) ),但是卻很容易寫,很容易處理一些對時間空間限制不大的毒瘤圖上多源/單源最短路問題。

for (k = 1; k <= n; k++) 

}}

#includeusing namespace std;

const int maxn = 205;

const int inf = 0x3f3f3f3f;

int edge[maxn][maxn],times[maxn];

int n,m,q;

int x,y,v,t;

int cur;

int main()

for(int i=0;i>x>>y>>v;

edge[x][y]=edge[y][x]=v;

}cin>>q;

while(q--){

cin>>x>>y>>t;

while(times[cur]<=t&&curt||times[y]>t||edge[x][y]>=inf) {

cout<<-1<

最短路 - oi wiki

題解 p1119 【災後重建】

P1119 災後重建

原題鏈結 一開始直接想跑最短路 看了看詢問次數 放棄了 然後果斷看了題解 floyd 用啥都不會用它的好嗎 平常的最劣選擇 但是 它就是正解 floyd的原理 就是列舉中點 這裡 因為出題人 已經把詢問排好了序 只需要判斷中點 有沒有重建完成 把它加入圖中 include include inclu...

P1119 災後重建

我覺得這個題出的很好,讓我對floyd 演算法有了乙個更深的理解。floyd 是乙個求多源最短路徑的演算法,演算法的內容很簡單。這個演算法的主要思路,就是通過其他的點進行中轉來求的兩點之間的最短路。因為我們知道,兩點之間有多條路,如果換一條路可以縮短距離的話,就更新最短距離。而它最本質的思想,就是用...

P1119 災後重建

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