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 }