1. 程式人生 > 其它 >洛谷P1119 災後重建 題解

洛谷P1119 災後重建 題解

技術標籤:java演算法c++python動態規劃

災後重建 - 洛谷

description:

一共

n 個村莊,每個村莊有一個通車時間 t_i 。有 m 條雙向邊。有 q 個詢問,每次詢問一組 (x,y,t) ,表示第 t 天時 (x,y) 之間的最短路徑。

solution:


看到資料範圍較小,直接

\text{floyd} 即可。

每次把當前能夠修建好的邊加入所有

n 個點的中轉點中,,,

給定的通車時間和每次的詢問都按照時間推移,這是好的,直接做就行了。

code:

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std; int f[1005][1005]; int a[20005]; int main() { memset(f,0x3f,sizeof(f)); memset(a,0x3f,sizeof(a)); int n,m; scanf("%d%d",&n,&m); /*for(int i=1;i<=n;i++) { for(int j=1;j<=n;j++) { f[i][j]=2147483640; } }*/ for(int i=1;i<=n;i++) { scanf("%d"
,&a[i]); f[i][i]=0; } for(int i=1;i<=m;i++) { int x,y,v; scanf("%d%d%d",&x,&y,&v); x++; y++; f[x][y]=f[y][x]=v; } int q,x,y,t; scanf("%d",&q); int k=1; while(q--) { //int k=0; scanf("%d%d%d",&x,&y,&t); x++; y
++; while(a[k]<=t) { for(int i=1;i<=n;i++) { for(int j=1;j<=n;j++) { f[i][j]=min(f[i][k]+f[k][j],f[i][j]); } } k++; } if(f[x][y]==0x3f3f3f3f||a[x]>t||a[y]>t) { printf("-1\n"); } else { printf("%lld\n",f[x][y]); } } return 0; }