災後重建 floyd演算法)

2021-09-26 16:28:19 字數 1667 閱讀 6206

題目背景

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

題目描述

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

如果無法找到從x村莊到y村莊的路徑,經過若干個已重建完成的村莊,或者村莊x或村莊yyy在第t天仍未重建完成 ,則需要返回−1。

輸入格式

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

第二行包含n個非負整數t0,t1,…,tn−1​,表示了每個村莊重建完成的時間,資料保證了t0≤t1≤…≤tn−1。接下來m行,每行3個非負整數i,j,w為不超過10000的正整數,表示了有一條連線村莊iii與村莊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在第ttt天仍未修復完成,則輸出−1。

輸入輸出樣例

輸入 #1

4 51 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

-1-154

建立圖示,用鄰接矩陣

int f[100][100];

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

f[x][y]=w;

f[y][x]=w;

}

floyd演算法:

求i到j的最短路徑

for(int k=0;k#include#include#define inf 0x3f3f3f3f

using namespace std;

int n,m,sum;//n個村莊,m條路

int f[201][201]=;

int timet[201];

scanf("%d",&sum);//sum個問題

int k=0;

for(int h=0;h>x>>y>>t;

while(timet[k]<=t&&kif(tcout<<"-1"

}return 0;

}

洛谷 1119 災後重建 Floyd

比較有趣的floyd,剛開始還真沒看出來。下午腦子不太清醒 先考慮一下floyd本身的實現原理,for k 1 k n k for i 1 i n i for j 1 j n j if e i j e i k e k j e i j e i k e k j 列舉圖中的每乙個點,用這些點去逐次更新當前...

洛谷 1119 災後重建 Floyd

比較有趣的floyd,剛開始還真沒看出來。下午腦子不太清醒 先考慮一下floyd本身的實現原理,for k 1 k n k for i 1 i n i for j 1 j n j if e i j e i k e k j e i j e i k e k j 列舉圖中的每乙個點,用這些點去逐次更新當前...

luogu1119 災後重建 floyd

p1119災後重建 好像洛谷的題解都在強調floyd的含義 不能只是背到floyd然後就用 還要理解floyd的含義 f i j 從i號頂點到j號頂點只經過前k號點的最短路程 然後還得有個優化 如果該點作為中轉點計算過 那麼就不用再走一遍 比較良心的是出題人是大小有順序地輸入 不加那個走過的判斷 q...