代码(Code)如下:
#include<bits/stdc++.h>
using namespace std;
int n,m,t[210],u[20000],v[20000],w[20000],q,x,y,z,dis[210],num[210],inf[1];
bool flag[210],vis[210];
struct node{
int k,v;
};
vector<node> a[210];
queue<int> qt;
int main(){
memset(inf,127,sizeof(inf));
scanf("%d%d",&n,&m);
for(int i=0;i<n;i++) scanf("%d",&t[i]);
for(int i=0;i<m;i++) scanf("%d%d%d",&u[i],&v[i],&w[i]);
scanf("%d",&q);
while(q--){
scanf("%d%d%d",&x,&y,&z);
memset(flag,0,sizeof(flag));
for(int i=0;i<n;i++){
if(t[i]<=z) flag[i]=1;
}
for(int i=0;i<n;i++){
num[i]=0;
a[i].clear();
}
for(int i=0;i<m;i++){
if(flag[u[i]]&&flag[v[i]]){
a[u[i]].push_back({v[i],w[i]});
a[v[i]].push_back({u[i],w[i]});
num[u[i]]++;
num[v[i]]++;
}
}
memset(vis,0,sizeof(vis));
memset(dis,127,sizeof(dis));
vis[x]=1;
dis[x]=0;
qt.push(x);
while(!qt.empty()){
int now=qt.front();
vis[now]=0;
for(int i=0;i<num[now];i++){
if(dis[now]+a[now][i].v<dis[a[now][i].k]){
dis[a[now][i].k]=dis[now]+a[now][i].v;
if(!vis[a[now][i].k]){
vis[a[now][i].k]=1;
qt.push(a[now][i].k);
}
}
}
qt.pop();
}
if(dis[y]==inf[0]) printf("-1\n");
else printf("%d\n",dis[y]);
}
return 0;
}