[luoguP1119] 灾后重建(Floyd)

传送门

 

基于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\n");
36         else printf("%d\n", dis[qx[l]][qy[l]]);
37     }
38     return 0;
39 }
View Code

 

posted @ 2017-05-05 15:09  zht467  阅读(181)  评论(0)    收藏  举报