#include <ostream>
#include <istream>
#include <vector>
#include <queue>
char buf[1 << 20],*p1,*p2;
#define getchar() (p1 == p2 && (p2 = (p1 = buf) + fread(buf,1,1<<20,stdin), p1 == p2) ? 0 : *p1++)
inline int read(){
register bool f = 1;
register int x = 0;
register char ch = getchar();
while (ch < '0' || ch > '9'){
if (ch == '-') f = !f;
ch = getchar();
}
while (ch >= '0' && ch <= '9'){
x = (x << 1) + (x << 3) + (ch ^ 48);
ch = getchar();
}
x *= f;
return x;
}
inline void write(int x){
if (x < 0) putchar('-'),x = -x;
if (x > 9) write(x / 10);
putchar(x % 10 + '0');
}
int dis[201],t[201],qq;
short n,m;
struct node{
short id;
int dis;
bool operator < (const node & a) const{
return dis > a.dis;
}
};
struct p{
short first,second;
};
std::vector<p> e[201];
void dij(short s,int ttt){
std::priority_queue<node> q;
bool vis[201] = {};
for (register short i(n);i >= 1;--i) dis[i] = 2147483647;
dis[s] = 0;
q.push(node{s,0});
while (q.size()){
short uu = q.top().id;
q.pop();
if (vis[uu]) continue;
vis[uu] = true;
for (register int i(0);i < e[uu].size();++i){
if (t[e[uu][i].first] > ttt) continue;
if (dis[e[uu][i].first] > dis[uu] + e[uu][i].second){
dis[e[uu][i].first] = dis[uu] + e[uu][i].second;
if (!vis[e[uu][i].first]) q.push({e[uu][i].first,dis[e[uu][i].first]});
}
}
}
}
main(){
n = read();
m = read();
for (register short i(1);i <= n;++i) t[i] = read();
for (register int i(m);i >= 1;--i){
int u = read() + 1,v = read() + 1,w = read();
e[u].emplace_back(p{v,w}),e[v].emplace_back(p{u,w});
}
qq = read();
for (register int i(qq);i >= 1;--i){
int x = read(),y = read(),tt = read();
++x,++y;
if (t[x] > tt || t[y] > tt){
putchar('-');
putchar('1');
putchar('\n');
continue;
}
dij(x,tt);
if (dis[y] == 2147483647){
putchar('-');
putchar('1');
putchar('\n');
}
else{
write(dis[y]);
putchar('\n');
}
}
return 0;
}
https://www.luogu.com.cn/record/198058472 用dij做的,T一个点。就差0.01s啊啊啊