P1119 灾后重建

灾后重建

洛谷链接

还是最小生成树的题,不过加上了时间限制,一开始没看到题目上面说的t保证升序输入,然后想啊想啊想啊,感觉不能直接用floyed啊,之后。。。。。。。。

就是裸的floyed,四重循环,再加一个时间的判断。

难度竟然是提高+/省选。

但我对于这个题目的评价,和上一个一样,只有一句话:dog题目。

还是要代码的:

 

 1 #include<cstdio>
 2 #include<algorithm>
 3 #define N 210
 4 #define M 50010
 5 #define MAXX 42000000
 6 using namespace std;
 7 int n,m,p,t[N],dis[N][N],a,b,c,px[M],py[M],pt[M],k;
 8 int main(){
 9     scanf("%d%d",&n,&m);
10     for(int i=0;i<n;++i)
11         scanf("%d",&t[i]);
12     t[n]=MAXX;
13     for(int i=0;i<n;++i)
14         for(int j=0;j<n;++j)
15             dis[i][j]=MAXX*(i!=j);
16     for(int i=0;i<m;++i){
17         scanf("%d%d%d",&a,&b,&c);
18         dis[a][b]=c;
19         dis[b][a]=c;
20     }
21     scanf("%d",&p);
22     for(int i=0;i<p;++i)
23         scanf("%d%d%d",&px[i],&py[i],&pt[i]);
24     for(int l=0;l<p;++l){
25         while(t[k]<=pt[l]){
26             for(int i=0;i<n;++i)
27                 for(int j=0;j<n;++j)
28                     dis[i][j]=min(dis[i][j],dis[i][k]+dis[k][j]);
29             k++;
30         }
31         if(t[px[l]]>pt[l]||t[py[l]]>pt[l]||dis[px[l]][py[l]]==MAXX)
32             printf("-1\n");
33         else
34             printf("%d\n",dis[px[l]][py[l]]);
35     }
36     return 0;
37 }
View Code

 

posted @ 2017-05-09 11:04  江屿  阅读(181)  评论(0编辑  收藏  举报