基于Floyd的动态规划原理,我们可以只用进行一次Floyd。
而题目给出的限制条件相当于给Floyd加了时间限制而已。
还是得靠对Floyd的理解。
——代码
1 #include <cstdio> 2 #include <iostream> 3 4 using namespace std; 5 6 const int MAXN = 201, INF = 23333333; 7 int n, m, q; 8 int t[MAXN], dis[MAXN][MAXN], qx[50001], qy[50001], qt[50001]; 9 10 int main() 11 { 12 int i, j, k = 0, x, y, l, z; 13 scanf("%d %d", &n, &m); 14 for(i = 0; i < n; i++) scanf("%d", &t[i]); 15 t[n] = INF; 16 for(i = 0; i < n; i++) 17 for(j = 0; j < n; j++) 18 dis[i][j] = INF * (i != j); 19 for(i = 1; i <= m; i++) 20 { 21 scanf("%d %d %d", &x, &y, &z); 22 dis[x][y] = dis[y][x] = z; 23 } 24 scanf("%d", &q); 25 for(i = 1; i <= q; i++) scanf("%d %d %d", &qx[i], &qy[i], &qt[i]); 26 for(l = 1; l <= q; l++) 27 { 28 while(t[k] <= qt[l]) 29 { 30 for(i = 0; i < n; i++) 31 for(j = 0; j < n; j++) 32 dis[i][j] = min(dis[i][j], dis[i][k] + dis[k][j]); 33 k++; 34 } 35 if(t[qx[l]] > qt[l] || t[qy[l]] > qt[l] || dis[qx[l]][qy[l]] == INF) printf("-1 "); 36 else printf("%d ", dis[qx[l]][qy[l]]); 37 } 38 return 0; 39 }