洛谷P1119 災後重建(floyd)
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。
輸入輸出格式
輸入格式:
輸入文件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是不下降的。
輸出格式:
輸出文件rebuild.out包含Q行,對每一個詢問(x, y, t)輸出對應的答案,即在第t天,從村莊x到村莊y的最短路徑長度為多少。如果在第t天無法找到從x村莊到y村莊的路徑,經過若幹個已重建完成的村莊,或者村莊x或村莊y在第t天仍未修復完成,則輸出-1。
輸入輸出樣例
輸入樣例#1: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輸出樣例#1:
-1 -1 5 4
說明
對於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。
/* 如果在每次floyd後處理詢問就需要考慮同一時間建立的點是否全部考慮完了。 */ #include<iostream> #include<cstdio> #include<cstring> #define N 50001 using namespace std; int n,m; int map[201][201],time[201],num[201]; int qa[N],qb[N],qt[N],vis[N]; struct node { int x,y; int val; }t[201][201]; int main() { scanf("%d %d",&n,&m); int maxt; for(int i=0;i<n;++i) { scanf("%d",&time[i]); } memset(map,0x3f,sizeof map); for(int i=1;i<=m;++i) { int a1,a2,a3; scanf("%d %d %d",&a1,&a2,&a3); map[a1][a2]=a3; map[a2][a1]=a3; } int qn; scanf("%d",&qn); int tot=0; for(int i=1;i<=qn;++i) { int a1,a2,a3; scanf("%d %d %d",&a1,&a2,&a3); if(a3<time[1]) printf("-1\n"); else { qa[++tot]=a1; qb[tot]=a2; qt[tot]=a3; } } for(int to=1;to<=tot;++to) { for(int k=0;k<n;++k) if(time[k]<=qt[to]&&!vis[k]) { vis[k]=1; for(int i=0;i<n;++i) for(int j=0;j<n;++j) if(i!=j&&i!=k&&j!=k) map[i][j]=min(map[i][j],map[i][k]+map[k][j]); } if(time[qa[to]]<=qt[to]&&time[qb[to]]<=qt[to]&&map[qa[to]][qb[to]]!=1061109567) printf("%d\n",map[qa[to]][qb[to]]); else printf("-1\n"); } }
洛谷P1119 災後重建(floyd)