floyed最短路的实质是用枚举转移中转点k,求出i~j的最短路。这题就很好的体现了这个性质。每个点加入图的时间是递增的,符合k循环的顺序,符合用前k个点中转出最短路的思想
const int N = 207;
int n, m;
int t[N];
int f[N][N];
inline void updata(int k) {
rep(i, 1, n) {
rep(j, 1, n) {
f[i][j] = min(f[i][j], f[i][k] + f[k][j]);
}
}
}
int main() {
read(n);
read(m);
rep(i, 1, n) {
read(t[i]);
}
memset(f, 0x3f, sizeof f);
rep(i, 1, n) {
f[i][i] = 0;
}
int x, y, z;
rep(i, 1, m) {
read(x);
read(y);
++x;
++y;
read(z);
f[x][y] = f[y][x] = z;
}
int Q;
read(Q);
int now(1);
while(Q--) {
read(x);
read(y);
++x;
++y;
read(z);
while(t[now] <= z && now <= n) {
updata(now);
++now;
}
if(t[x] > z || t[y] > z) out(-1, '
');
else {
out(f[x][y] > 1e9 ? -1 : f[x][y], '
');
}
}
return 0;
}