我们发现每次询问都是对于任意两点的,所以这是一道多源最短路径的题,多源最短路径,我们首先想到floyd,因为询问的时间是不降的,所以对于每次询问,我们将还没有进行松弛操作的的点k操作。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <algorithm>
#include <cmath>
using namespace std;
const int MAXN=205;
int init(){
int rv=0,fh=1;
char c=getchar();
while(c<'0'||c>'9'){
if(c=='-') fh=-1;
c=getchar();
}
while(c>='0'&&c<='9'){
rv=(rv<<1)+(rv<<3)+c-'0';
c=getchar();
}
return rv*fh;
}
int dis[MAXN][MAXN],n,m,t[MAXN],q,p;
inline void floyd(int k){
for(register int i=1;i<=n;i++){
for(register int j=1;j<=n;j++){
dis[i][j]=min(dis[i][j],dis[i][k]+dis[k][j]);
}
}
}
int main(){
freopen("in.txt","r",stdin);
n=init();m=init();
for(int i=1;i<=n;i++){
t[i]=init();
}
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
dis[i][j]=0x7fffffff/3;
}
dis[i][i]=0;
}
for(int i=1;i<=m;i++){
int u=init(),v=init(),di=init();
dis[u+1][v+1]=di;dis[v+1][u+1]=di;
}
q=init();
for(int i=1;i<=q;i++){
int x=init(),y=init(),ti=init();
x++;y++;
if(t[x]>ti||t[y]>ti) {printf("-1\n");continue;}
while(t[p+1]<=ti&&(p<=n-1)) floyd(++p);
if(dis[x][y]==0x7fffffff/3) printf("-1\n");
else printf("%d\n",dis[x][y]);
}
fclose(stdin);
return 0;
}

最新文章

  1. 深入了解try catch
  2. JavaScript 基础第六天
  3. Android中的Touch事件
  4. c#之Redis队列在邮件提醒中的应用
  5. XDU 1161 - 科协的数字游戏II
  6. 保存字符串到手机SDcard为txt文件
  7. 如何生成RestFul Api文档
  8. 批量修改Sqlserver中数据库对象的所属架构
  9. HDU 3085 Nightmare Ⅱ 双向BFS
  10. SQL内外左右交叉连接
  11. python基础教程第二版 第一章
  12. .net中如何实现多线程
  13. gcc编译器的工作流程
  14. 第九周LINUX 学习笔记
  15. 在Java中使用redisTemplate操作缓存
  16. Android远程桌面助手之系统兼容篇
  17. HTML有哪些标签?html常用标签大全
  18. 刘志梅2017710101152.《面向对象程序设计(java)》第十三周学习总结
  19. 启动 mysql 时报错
  20. 个人github链接及git学习心得总结

热门文章

  1. 2017ecjtu-summer training #2 POJ2503
  2. 南阳理工oj_The Triangle
  3. 【Zigbee技术入门教程-号外】基于Z-Stack协议栈的抢答系统
  4. The most interesting feature of iPhone X - FaceID
  5. 评论发布信息可插入QQ表情
  6. url加密,一般只对参数加密
  7. es6重点笔记:对象
  8. redux学习日志:关于react-redux
  9. wigs的理解和应用
  10. Windows10下用Anaconda3安装TensorFlow教程